SpringSecurity配置(权限认证)
文末有本篇文章的项目源码可供下载学习
0.配置思路
- 在本项目案例的基础上进行相关的配置。
- 在数据库中建立权限表/角色表/角色-权限表,并在用户表中加入role_id属性,与角色表进行关联
- 生成相应的pojo层/mapper层文件
- 修改UserDetailsServiceImpl.java中的loadUserByUsername方法,获取登录用户所对应的权限信息,并将权限信息放入到UserDetailsImpl中.
- 在需要权限验证的Controller方法中,利用@PreAuthorize注解,标注好对应的权限信息.
- 在SecurityConfig.java文件中开启注解支持.@EnableGlobalMethodSecurity(prePostEnabled = true)
- 进行相关测试.
1.数据库表操作
1.1权限表
1.2角色表
1.3角色-权限表
1.4修改用户表,将role_id属性加入到用户表中
2. 新建pojo层/mapper层文件
/*** @TableName perm*/
@Data
public class Perm {private String id;private String name;private String permStr;
}
/*** @TableName role*/
@Data
public class Role {private String id;private String name;private String roleStr;}
新添roleId属性
/*** @TableName user*/
@Data
public class User {private String id;private String username;private String password;private String currentFlag;private String roleId;
}
<select id="findListByUserId" resultType="com.my.ssm.pojo.Perm">SELECT perm.*FROM user,user_role,role_perm,permWHERE user.id = #{userId}AND user.id=user_role.user_idAND user_role.role_id = role_perm.role_idAND role_perm.perm_id = perm.id</select>
3.修改UserDetailsServiceImpl.java,获取登录用户的权限信息
@Service
public class UserDetailsServiceImpl implements UserDetailsService {@Autowiredprivate UserMapper userMapper;@Autowiredprivate PermMapper permMapper;/*** SpringSecurity会调用UserDetailsService的loadUserByUsername方法验证用户名是否合法,合法用户将用户信息和用户权限信息封装到UserDetailsImpl对象中.* @param username* @return*/@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException{
// 1.通过用户名查询User信息User user = userMapper.findUserByUsername(username);if (Objects.isNull(user)) {throw new RuntimeException("用户名不正确");}//2.查询用户的权限信息List<Perm> permList = permMapper.findListByUserId(user.getId());List<String> permStringList = new ArrayList<>();for (Perm perm : permList) {permStringList.add(perm.getPermStr());}//3.返回UserDetails接口的实现类对象return new UserDetailsImpl(user,permStringList);}
}
4.修改UserDetailsImpl.java
@Data
@NoArgsConstructor
public class UserDetailsImpl implements UserDetails {private User user;private List<String> permissions;@JSONField(serialize = false)private List<GrantedAuthority> authorities;public UserDetailsImpl(User user, List<String> permissions) {this.user = user;this.permissions = permissions;}/*** 获取权限信息* @return*/@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {if (!Objects.isNull(authorities)) {return authorities;}// 将permissions授权信息封装到GrantedAuthority对象集合中authorities = new ArrayList<>();for (String permission : permissions) {SimpleGrantedAuthority authority = new SimpleGrantedAuthority(permission);authorities.add(authority);}return authorities;}/*** 获取密码信息* @return*/@Overridepublic String getPassword() {return this.user.getPassword();}/*** 获取用户名信息* @return*/@Overridepublic String getUsername() {return this.user.getUsername();}@Overridepublic boolean isAccountNonExpired() {return true;}@Overridepublic boolean isAccountNonLocked() {return true;}@Overridepublic boolean isCredentialsNonExpired() {return true;}@Overridepublic boolean isEnabled() {return true;}
}
5.在Controller方法中配置权限信息
@RestController
@RequestMapping("customer")
public class CustomerController {@GetMapping("firstMethod")@PreAuthorize("hasAuthority('customerPermission')")public String firstMethod() {return "这是自定义Controller的第一个方法";}
}
6.开启权限注解的支持
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {......
}
7.相关测试
7.0准备数据
在role表中新增id为1的数据,并将lisi的role_id设置为1
此时role_perm表为空表,说明任何角色都没有相应的权限
7.1登录,获取token
7.2访问自定义方法,发现被拒绝访问
7.3将自定义方法的权限信息注释掉,再次访问自定义方法
我们发现是可以访问的,说明权限信息的校验起效果了.
7.3在数据库中新添权限信息后访问
将自定义Controller中的自定义方法上的权限信息取消注释
再次访问测试
本篇文章的项目源码文件,可供点击下载学习