页面按钮权限的控制,其实就是利用RBAC1权限控制和sec:authorize标签。
一、引入pom依赖
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity5</artifactId>
</dependency>
- 此处使用spring-boot-starter-parent:2.4.8,spring-cloud-dependencies:2020.0.3
- 如不引入该依赖会导致sec:authorize命名空间无效;spring-security其他依赖自行引入
二、实现RBAC权限控制
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
........
@Override
protected void configure(HttpSecurity http) throws Exception {
......
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
......
}
}
三、重写hasPermission方法
@Component
public class UserPermissionEvaluator implements PermissionEvaluator {
@Autowired
private SysUserRepository userRepository;
/**
* hasPermission鉴权方法
* @Param permission 请求按钮的权限
* @Return boolean 是否通过
*/
@Override
public boolean hasPermission(Authentication authentication, Object targetUrl, Object permission) {
Object principal = authentication.getPrincipal();
boolean hasPermission = false;
if(principal != null && principal instanceof UserDetails){
String name=((UserDetails) principal).getUsername();
SysUser sysUser=userRepository.findByName(name);
Set<String> permissions = new HashSet<>();
for(SysRole role : sysUser.getRoles()){
for(SysPermission sysPermission:role.getPermissions()){
permissions.add(sysPermission.getName());
}
}
if (permissions.contains(permission.toString())){
return true;
}
}
return hasPermission;
}
@Override
public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) {
return false;
}
}
四、在WebSecurityConfig类中注入自定义Bean
@Bean
public DefaultWebSecurityExpressionHandler userSecurityExpressionHandler() {
DefaultWebSecurityExpressionHandler handler = new DefaultWebSecurityExpressionHandler();
handler.setPermissionEvaluator(new UserPermissionEvaluator());
return handler;
}
@Bean
public SpringSecurityDialect springSecurityDialect(){
return new SpringSecurityDialect();
}
五、html中引入命名空间
<html
xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
现在,可以使用页面的标签及其方法上的注解
<div sec:authorize="hasPermission('test','adduser1')">
<input type="submit" value="提交" class="btn btn-info"/>
</div>
用户只要有adduser1的permission即可见到‘提交’按钮了。第一个参数test在这里用不上。
RBAC 是基于角色的访问控制(Role-Based Access Control )在 RBAC 中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便。 ↩︎