项目经验①之鉴权
前言
在项目中,咱们总会遇到各种各样的问题,不管是遇到的bug,或者是自己不会写的,或者是别人的代码比你好,用的方法比你便捷,或者是温故知新,都是学习的动力,值得一记。
一、鉴权是什么?
鉴权有很多种,我们今天不谈那种session-cookie,token那些,讲的仅仅只是从用户登录后,根据不同的角色和权限做对应的操作(想了解其他的可以找一下其他博主得文章,我技术水平有限,仅仅记录自己当前项目遇到的,例如https://blog.csdn.net/sinat_33255495/article/details/103920131),目前我们使用的是安全框架Spring Security下的注解来控制。
二、Spring Security
该部分可以参考其他博主的https://blog.csdn.net/FlyingFish868/article/details/121771605
三、@PreAuthorize
@PreAuthorize这个注解可以用来控制一个方法或类是否能够被调用的,通常都用在controller层,通俗一点来说就是前端调用的时候看看当前登录的用户有没有权利调用被注解的接口方法
里面的参数是用EL表达式来处理的,正常的应该是
- hasRole,对应 public final boolean hasRole(String role)
方法,含义为必须含有某角色(非ROLE_开头),如有多个的话,必须同时具有这些角色,才可访问对应资源。 - hasAnyRole,对应 public final boolean hasAnyRole(String… roles)
方法,含义为只具有有某一角色(多多个角色的话,具有任意一个即可),即可访问对应资源。 - hasAuthority,对应 public final boolean hasAuthority(String authority)
方法,含义同 hasRole,不同点在于这是权限,而不是角色,区别就在于权限往往带有前缀(如默认的ROLE_),而角色只有标识。 - hasAnyAuthority,对应 public final boolean hasAnyAuthority(String…
authorities) 方法,含义同hasAnyRole,不同点在于这是权限,而不是角色,区别就在于权限往往带有前缀(如默认的ROLE_),而角色只有标识 - permitAll,对应 public final boolean permitAll() 方法,含义为允许所有人(可无任何权限)访问。
- denyAll,对应 public final boolean denyAll() 方法,含义为不允许任何(即使有最大权限)访问。
- isAnonymous,对应 public final boolean isAnonymous() 方法,含义为可匿名(不登录)访问。
- isAuthenticated,对应 public final boolean isAuthenticated()
方法,含义为身份证认证后访问。 - isRememberMe,对应 public final boolean isRememberMe() 方法,含义为记住我用户操作访问。
- isFullyAuthenticated,对应 public final boolean isFullyAuthenticated()
方法,含义为非匿名且非记住我用户允许访问。
不过咱们这里有些不一样,用的是hasPermission
Spring Security为我们定义了hasPermission的两种使用方式,它们分别对应着PermissionEvaluator的两个不同的hasPermission()方法。Spring Security默认处理Web、方法的表达式处理器分别为DefaultWebSecurityExpressionHandler和DefaultMethodSecurityExpressionHandler,它们都继承自AbstractSecurityExpressionHandler,其所持有的PermissionEvaluator是DenyAllPermissionEvaluator,其对于所有的hasPermission表达式都将返回false。所以当我们要使用表达式hasPermission时,我们需要自已手动定义SecurityExpressionHandler对应的bean定义,然后指定其PermissionEvaluator为我们自己实现的PermissionEvaluator,然后通过global-method-security元素或http元素下的expression-handler元素指定使用的SecurityExpressionHandler为我们自己手动定义的那个bean。(别人转载的没找到原文章)
括号里面的参数一个角色比对一个权限比对,因为目前写的是工单派发审核这些,只需要验证登录用户的权限是否与括号内的对应即可,至于检测,目前还在等新同事写完前端在联调测试,如果有误我会及时更新
总结
以上就是今天要讲的内容,本文仅仅简单介绍了@PreAuthorize的使用,具体的大家还是结合大佬们的文章参考吧,我仅仅是个人记录一下。