Spring Security 用户定义

 2023-02-15
原文作者:周杰伦本人 原文地址:https://juejin.cn/post/7012760490854072356

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

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数据库的,如果关于用户定义有什么不理解的地方欢迎给我留言评论,如果觉得文章还不错的的话,给我点个赞吧,下篇文章我们将继续继续讲解Spring Security的相关知识点。