写在前面
@PreAuthorize注解会在方法执行前进行权限验证,支持Spring EL表达式,它是基于方法注解的权限解决方案。只有当@EnableGlobalMethodSecurity(prePostEnabled=true)的时候,@PreAuthorize才可以使用,@EnableGlobalMethodSecurity注解在SPRING安全中心进行设置,如下:
/**
* SPRING安全中心
* @author ROCKY
*/@EnableGlobalMethodSecurity(prePostEnabled =true, securedEnabled =true)publicclassSecurityConfigextendsWebSecurityConfigurerAdapter{}
如何使用
①. 注解如何使用?
/**
* 删除用户
*/@PreAuthorize("@ss.hasPermi('system:user:remove')")@Log(title ="用户管理", businessType =BusinessType.DELETE)@DeleteMapping("/{userIds}")publicResultremove(@PathVariableLong[] userIds){if(ArrayUtils.contains(userIds,getUserId())){returnerror("当前用户不能删除");}returntoAjax(userService.deleteUserByIds(userIds));}
②. 自定义权限实现
@PreAuthorize(“@ss.hasPermi(‘system:user:remove’)”)的意思是什么?
A. ss 是一个注册在 Spring容器中的BEAN,对应的类是cn.hadoopx.framework.web.service.PermissionService;
B. hasPermi 是PermissionService类中定义的方法;
C.当Spring EL 表达式返回TRUE,则权限校验通过;
D. PermissionService.java的定义如下:
/**
* 自定义权限实现,ss取自SpringSecurity首字母
* @author ROCKY
*/@Service("ss")publicclassPermissionService{/**
* 所有权限标识
*/privatestaticfinalString ALL_PERMISSION ="*:*:*";/**
* 管理员角色权限标识
*/privatestaticfinalString SUPER_ADMIN ="admin";privatestaticfinalString ROLE_DELIMETER =",";privatestaticfinalString PERMISSION_DELIMETER =",";/**
* 验证用户是否具备某权限
* @param permission 权限字符串
* @return 用户是否具备某权限
*/publicbooleanhasPermi(String permission){if(StringUtils.isEmpty(permission)){returnfalse;}LoginUser loginUser =SecurityUtils.getLoginUser();if(StringUtils.isNull(loginUser)||CollectionUtils.isEmpty(loginUser.getPermissions())){returnfalse;}returnhasPermissions(loginUser.getPermissions(), permission);}/**
* 验证用户是否不具备某权限,与 hasPermi逻辑相反
* @param permission 权限字符串
* @return 用户是否不具备某权限
*/publicbooleanlacksPermi(String permission){returnhasPermi(permission)!=true;}/**
* 验证用户是否具有以下任意一个权限
* @param permissions 以 PERMISSION_NAMES_DELIMETER 为分隔符的权限列表
* @return 用户是否具有以下任意一个权限
*/publicbooleanhasAnyPermi(String permissions){if(StringUtils.isEmpty(permissions)){returnfalse;}LoginUser loginUser =SecurityUtils.getLoginUser();if(StringUtils.isNull(loginUser)||CollectionUtils.isEmpty(loginUser.getPermissions())){returnfalse;}Set<String> authorities = loginUser.getPermissions();for(String permission : permissions.split(PERMISSION_DELIMETER)){if(permission !=null&&hasPermissions(authorities, permission)){returntrue;}}returnfalse;}/**
* 判断用户是否拥有某个角色
* @param role 角色字符串
* @return 用户是否具备某角色
*/publicbooleanhasRole(String role){if(StringUtils.isEmpty(role)){returnfalse;}LoginUser loginUser =SecurityUtils.getLoginUser();if(StringUtils.isNull(loginUser)||CollectionUtils.isEmpty(loginUser.getUser().getRoles())){returnfalse;}for(SysRole sysRole : loginUser.getUser().getRoles()){String roleKey = sysRole.getRoleKey();if(SUPER_ADMIN.equals(roleKey)|| roleKey.equals(StringUtils.trim(role))){returntrue;}}returnfalse;}/**
* 验证用户是否不具备某角色,与 isRole逻辑相反。
* @param role 角色名称
* @return 用户是否不具备某角色
*/publicbooleanlacksRole(String role){returnhasRole(role)!=true;}/**
* 验证用户是否具有以下任意一个角色
* @param roles 以 ROLE_NAMES_DELIMETER 为分隔符的角色列表
* @return 用户是否具有以下任意一个角色
*/publicbooleanhasAnyRoles(String roles){if(StringUtils.isEmpty(roles)){returnfalse;}LoginUser loginUser =SecurityUtils.getLoginUser();if(StringUtils.isNull(loginUser)||CollectionUtils.isEmpty(loginUser.getUser().getRoles())){returnfalse;}for(String role : roles.split(ROLE_DELIMETER)){if(hasRole(role)){returntrue;}}returnfalse;}/**
* 判断是否包含权限
* @param permissions 权限列表
* @param permission 权限字符串
* @return 用户是否具备某权限
*/privatebooleanhasPermissions(Set<String> permissions,String permission){return permissions.contains(ALL_PERMISSION)|| permissions.contains(StringUtils.trim(permission));}}
③. 如何使用原生的权限?
版权归原作者 cloneme01 所有, 如有侵权,请联系我们删除。