Spring Security用户定义

举报
周杰伦本人 发表于 2022/05/11 09:18:57 2022/05/11
【摘要】 Spring Security用户定义大家都知道 Spring Security的用户定义有很多方式,这篇文章主要讲解我们常用的两种方式,基于内存的用户定义和基于数据库的用户定义,下面我给大家简单介绍一下这两种方式。 基于内存Spring Security中的配置:@Overrideprotected void configure(AuthenticationManagerBuilder ...

Spring Security用户定义

大家都知道 Spring Security的用户定义有很多方式,这篇文章主要讲解我们常用的两种方式,基于内存的用户定义和基于数据库的用户定义,下面我给大家简单介绍一下这两种方式。

基于内存

Spring Security中的配置:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
    manager.createUser(User.withUsername("admin").password("{noop}123").roles("admin").build());
    manager.createUser(User.withUsername("sang").password("{noop}123").roles("user").build());
    auth.userDetailsService(manager);
}

这段代码是基于内存的用户定义,分别设置了两个用户 admin和sang,密码都是不加密的123,然后角色分别对应的admin和user,使用InMemoryUserDetailsManager对象创建好对象后,将InMemoryUserDetailsManager对象信息添加到AuthenticationManagerBuilder中

基于mybatis

MyUserDetailsService

@Service
public class MyUserDetailsService implements UserDetailsService {
    @Autowired
    UserMapper userMapper;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userMapper.loadUserByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("用户不存在");
        }
        user.setRoles(userMapper.getRolesByUid(user.getId()));
        return user;
    }
}

User类:

public class User implements UserDetails {
    private Integer id;
    private String username;
    private String password;
    private Boolean enabled;
    private Boolean accountNonExpired;
    private Boolean accountNonLocked;
    private Boolean credentialsNonExpired;
    private List<Role> roles = new ArrayList<>();

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", enabled=" + enabled +
                ", accountNonExpired=" + accountNonExpired +
                ", accountNonLocked=" + accountNonLocked +
                ", credentialsNonExpired=" + credentialsNonExpired +
                ", roles=" + roles +
                '}';
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        List<SimpleGrantedAuthority> authorities = new ArrayList<>();
        for (Role role : roles) {
            authorities.add(new SimpleGrantedAuthority(role.getName()));
        }
        return authorities;
    }

    
}

我们通过实现UserDetailsService接口,重写它的loadUserByUsername()方法,方法中调用了Mybatis的Mapper接口来根据用户名查询用户信息,

然后判断用户是否存在,不存在的话就可以抛出异常了,没有必要再继续下面的流程,

如果存在的话,对用户设置角色信息,其中角色信息也是调用数据库来根据用户的id来进行查询的,最后返回用户信息

然后User类实现了UserDetails接口,重写他的getAuthorities()方法,这个方法中是对应的角色信息,不能为空,为空的话表示没有权限

Spring Security中的配置:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(myUserDetailsService);
}

这段代码是对自定义的UserDetailsService的配置,添加到AuthenticationManagerBuilder对象中

总结

好了,Spring Security中的用户定义的常用的两个定义用户的方式,基于内存和基于Mybatis数据库的,在生产中往往我们会使用基于Mybatis数据库的用户定义。如果关于用户定义有什么不理解的地方欢迎给我留言评论,如果觉得文章还不错的的话,给我点个赞吧,下篇文章我们将继续继续讲解Spring Security的相关知识点。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。