方法级别权限控制
1.需要坐标
javax.annotation
jsr250-api
1.0
2.在配置文件spring-security.xml 中开启 注解 默认是关闭的
3.在控制器中 添加注解 @RolesAllowed("ADMIN") 可以写多个角色 可以省略 只有 有admin角色的用户才能访问
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/findAll.do")
@RolesAllowed("ADMIN") 只有 有admin角色的用户才能访问
public ModelAndView findAll() {
ModelAndView mv = new ModelAndView();
List list=iUserService.findAll();
mv.addObject("userList",list);
mv.setViewName("user-list");
return mv;
}
}
@PermitAll 表示允许所有的角色进行访问,也就是说不进行权限控制
@DenyAll 是和PermitAll相反的,表示无论什么角色都不能访问
4.权限不足时 前端会报 403 权限不足的错误 可以在web.xml配置 错误页面 将页面放在webapp下
403
/403.jsp
是Spring 自带的注解 不需要再导入包了
在spring-security.xml配置文件 开启注解 功能
@RequestMapping("/findAll.do")
// @RolesAllowed("ADMIN")
@Secured("ROLE_ADMIN")
public ModelAndView findAll() {
ModelAndView mv = new ModelAndView();
List list=iUserService.findAll();
mv.addObject("userList",list);
mv.setViewName("user-list");
return mv;
}
与jsr250区别是 必须写配置文件中声明的 拦截角色名称
需要在 spring-security.xml 开启功能
"hasRole('ROLE_ADMIN')" 只有ROLE_ADMIN 角色的用户 才能查询所有
@RequestMapping("/findAll.do")
// @RolesAllowed("ADMIN")
// @Secured("ROLE_ADMIN")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public ModelAndView findAll() {
ModelAndView mv = new ModelAndView();
List list=iUserService.findAll();
mv.addObject("userList",list);
mv.setViewName("user-list");
return mv;
}
"authentication.principal.username == 'wyc'" 只有用户名为wyc 的用户才能使用save方法
@RequestMapping("/save.do")
@PreAuthorize("authentication.principal.username == 'wyc'")
public String saveUser(UserInfo userInfo) {
iUserService.save(userInfo);
return "redirect:findAll.do";
}
表达式 |
描述 |
hasRole([role]) |
当前用户是否拥有指定角色。 |
hasAnyRole([role1,role2]) |
多个角色是一个以逗号进行分隔的字符串。如果当前用户拥有指定角色中的任意一个则返回true。 |
hasAuthority([auth]) |
等同于hasRole |
hasAnyAuthority([auth1,auth2]) |
等同于hasAnyRole |
Principle |
代表当前用户的principle对象 |
authentication |
直接从SecurityContext获取的当前Authentication对象 |
permitAll |
总是返回true,表示允许所有的 |
denyAll |
总是返回false,表示拒绝所有的 |
isAnonymous() |
当前用户是否是一个匿名用户 |
isRememberMe() |
表示当前用户是否是通过Remember-Me自动登录的 |
isAuthenticated() |
表示当前用户是否已经登录认证成功了。 |
isFullyAuthenticated() |
如果当前用户既不是一个匿名用户,同时又不是通过Remember-Me自动登录的,则返回true。 |
在jsp页面中我们可以使用spring security提供的权限标签来进行权限控制 导入坐标
org.springframework.security
spring-security-taglibs
version
jsp 页面 需要导入坐标
<%@taglib uri="http://www.springframework.org/security/tags" prefix="security"%>
在spring-security.xml 配置文件 开启支持 jsp页面的 SpringEL表达式 功能 所以以前的 改为 EL表达式的形式
开启spring EL 表达式
1. authentication 在jsp页面 获取当前登录用户 principal.username 获取当前用户的 用户名 显示在线
2. authorize 控制 页面 显示标签的权限
只有admin 角色的用户 才能 显示 被security:authorize 包裹的 标签
访问日志