写点什么

Spring Security 用户定义

作者:周杰伦本人
  • 2022 年 7 月 11 日
  • 本文字数:1694 字

    阅读完需:约 6 分钟

Spring Security 用户定义

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

基于内存

Spring Security 中的配置:


@Overrideprotected 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


@Servicepublic 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 中的配置:


@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {    auth.userDetailsService(myUserDetailsService);}
复制代码


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

总结

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

发布于: 刚刚阅读数: 4
用户头像

还未添加个人签名 2020.02.29 加入

公众号《盼盼小课堂》,多平台优质博主

评论

发布
暂无评论
Spring Security用户定义_7月月更_周杰伦本人_InfoQ写作社区