@RolesAllowed JSR250权限控制
- 在pom文件导入坐标
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</dependency>
- 在spring-security.xml文件中配置开启权限控制
<security:global-method-security jsr250-annotations="enabled" />
- 在方法上加注解 @RolesAllowed(“角色名”)
这样配置,只有角色匹配的用户才可以访问该方法.
@Secured
- 在spring-security.xml文件中配置开启权限控制
<security:global-method-security secured-annotations="enabled" />
- 在方法上加注解 @Secured (“ROLE_”+“角色名”)
这样配置,只有角色匹配的用户才可以访问该方法.这种方法需要在角色名前面加上前缀 “ROLE_” 否则不生效;
@PreAuthorize
- 在spring-security.xml文件中配置开启权限控制
<security:global-method-security pre-post-annotations="enabled" />
- 在方法上加注解 @PreAuthorize()
这种方式可以再括号内写表达式
@PreAuthorize(hasRole(‘ROLE_角色名’))
hasRole(‘角色名’) 返回true 表示可以访问,返回为false 表示不能访问
authentication–令牌对象
principal–用户详情对象
username–属性
@PreAuthorize(authentication.principal.username == ‘tom’)
返回true表示可以访问,返回为false 表示不能访问
这个表达式通过用户登录之后将用户令牌(Token)存储在一个securityContext对象中,这个令牌对象中有用户详情信息,这个注解工作原理就是从这个令牌对象中获得用户信息,在做判断;
url路径检查权限认证
- 让自己的 UserInfo 对象实现了 UserDetails 接口,让它包含更全面的信息(角色,权限url)
原来spring security 自带的User 包含的信息不全(只有角色信息),UserDetails是springSecurity的一个接口. - 自定义检查 url 权限的方法
@Service("securityService")
public class SecurityService {
// 检查某个 url 是否能够被访问(根据用户权限)
public boolean accessiable(UsernamePasswordAuthenticationToken authentication, HttpServletRequest request) {
// 1. 获取当前请求的 url 地址
String uri = request.getRequestURI(); // /ssm/user/findAll.do
String path = request.getContextPath();// 获取虚拟路径
uri = uri.replace(path, "");
// 2. 获取用户详情, 因为认证时已经替换为自己的 UserInfo对象了,所以可以强转
//从底层代码看出UsernamePasswordAuthenticationToken对象将用户详细信息封装进了principal这个属性中;
UserInfo userInfo = (UserInfo) authentication.getPrincipal();
// 3. 获取用户所有的 url
List<String> urls = new ArrayList<>();
List<Role> roles = userInfo.getRoles();
for (Role role : roles) {
List<Permission> permissions = role.getPermissions();
for (Permission permission : permissions) {
urls.add(permission.getUrl());
}
}
// 4. 判断是否可以访问
return urls.contains(uri);
}
}
3.包扫描,扫描到刚才的securityService,在 spring-security.xml中
<context:component-scan base-package="com.itheima.ssm.security"/>
4.添加 url 路径权限检查
<!-- 对于controller 路径,做【认证 + url 路径权限】
* isAuthenticated() :判断是否认证(是否成功登录),如果认证了,再检查url是否合法
* @securityService.accessiable:是调用 securityService 的方法做 url 路径权限检查
* @securityService.accessiable(authentication, request)括号中的参数必须是这两个,要与上面的securityService对应
-->
<sec:intercept-url pattern="/user/**"
access="isAuthenticated() and @securityService.accessiable(authentication, request)"/>
<sec:intercept-url pattern="/product/**"
access="isAuthenticated() and @securityService.accessiable(authentication, request)"/>
<sec:intercept-url pattern="/orders/**"
access="isAuthenticated() and @securityService.accessiable(authentication, request)"/>
<sec:intercept-url pattern="/role/**"
access="isAuthenticated() and @securityService.accessiable(authentication, request)"/>
<sec:intercept-url pattern="/permission/**"
access="isAuthenticated() and @securityService.accessiable(authentication, request)"/>
<!-- 剩余的,仅作【认证检查】-->
<sec:intercept-url pattern="/**" access="isAuthenticated()"/>