1. 原理
1 进入hasAuthority()方法
2 上面方法调用了hasAnyAuthority()方法
3 上面方法调用了hasAnyAuthorityName()方法
hasAnyAuthorityName() 方法中调用了getAuthoritySet() 方法返回一个权限Set,而getAuthoritySet() 方法则调用了getAuthorities() 。这个权限Set就是由getAuthorities()返回的Collection转换而来的。
而我们的项目之前在SecurityUser(UserDetails的实现类)中覆写了getAuthorities() 方法
当我们的前端提交用户名和密码进行登录时,会调用UserDetailsServiceImpl中我们覆写的
loadUserByUsername() 方法,创建SecurityUser对象并将根据用户名查询到的权限值列表赋值到SecurityUser对象的permissionValueList成员变量中,最后返回SecurityUser对象。
4
这样 spring调用 getAuthorities() 就能够我们登录时得到权限列表值。 最终回到@PreAuthorize(“hasAuthority(‘xxx’)”)注解,该注解就可以根据’xxx’是否存在于getAuthorities() 来判断该登录用户是否具有访问注解修饰的方法的权限。
2 使用
上面注解使用在了controller层中的某一个edit方法上,@PreAuthorize(“hasAuthority(‘xxx’)”)注解根据是否存在’mpp250.edit’来判定当前登录用户是否具有访问edit方法的权限。