0
点赞
收藏
分享

微信扫一扫

SpringSecurity-1-UserDetails接口


这个接口是我们自己用来定义用户表的结构的

SpringSecurity自己的用户信息只包含了Username,password,roles,假如我希望用户的实体类中还有性别sex字段,那么就没有办法了,所以SpringSecurity提供了UserDetails接口,我们可以自己新建一个包含sex字段的类,然后该类implements UserDetails接口,就可以获取我们说的这个sex字段

UserDetails实例是通过UserDetailsService接口的loadUserByUsername方法返回的,可以参考​​这篇文章​​创建自己的UserDetails(本文中包含sex的那个类)

UserDetails接口中有一个getAuthorities方法,这个方法返回的是权限,但是我们返回的权限必须带有“ROLE_”开头才可以,spring会自己截取ROLE_后边的字符串,也就是说,比如:我的权限叫ADMIN,那么,我返回告诉spring security的时候,必须告诉他权限是ROLE_ADMIN,这样spring security才会认为权限是ADMIN

示例代码:
假设一个用户拥有两个权限,一个叫权限1,一个叫权限2,下面的代码演示了如何使用UserDetails接口获取这两个权限,其本质就是实现getAuthorities()方法

public MyUser implements UserDetails{
// 这个GrantedAuthority是什么呢?其实它就是权限(Role),
// 因为本例中该用户有两个权限,所以这个Collection的长度是2
@Override
public Collection<? extends GrantedAuthority> getAuthorities(){
String role1="ROLE_权限1";
String role2="ROLE_权限2";
GrantedAuthority authority1=new SimpleGrantedAuthority(role1);
GrantedAuthority authority2=new SimpleGrantedAuthority(role2);
List<GrantedAuthority> list=new ArrayList<>();
list.add(authority1);
list.add(authority2);
return list;
}
}

根据UserDetails接口,我们知道spring更推荐将权限用逗号隔开的方式存到数据库user表中,而不推荐使用1对多的方式来存储权限(单独的一个user表和权限表,然后使用一个关系表将两个表关联起来)

注:
spring security提供了逗号工具类,可以将逗号格式的字符串转换成GrantedAuthority

AuthorityUtils.commaSeparatedStringToAuthorityList

这样上述示例代码中就省掉了很多代码


举报

相关推荐

0 条评论