控制方法访问的注解使用
- JSR-250的介绍
- 使用步骤
- 第一步:在spring-security.xml中开启
- 第二步:导入maven依赖
- 第三步:在指定的方法上添加注解
- 另外在web.xml中可以配置403出错的页面
- @Secured注解的使用
- 第一步:在spring-security文件中开启注解
- 第二步:在对应的方法上添加注解
- 表达式使用的介绍
- 第一步:在spring-security中开启配置
- 第二步:使用,可以使用SPEL表达式
JSR-250的介绍
在服务器端我们可以通过Spring security提供的注解对方法来进行权限的控制。Spring Security在方法的控制权限上支持三种类型的注解,JSR-250注解、@Secured注解和支持表达式的注解,这三种注解默认都是没有启动的,需要单独通过global-method-security元素的对应属性进行启用。
JSR-250的三种注解:
- @RolesAllowed:表示访问对应方法时所应具有的角色
示例:@RolesAllowed({“User”,“ADMIN”}) 该方法只要具有"User","Admin"任意一种权限就可以访问。这里可以省略前缀ROLE_,实际的权限可能是ROLE_ADMIN - @PermitAll表示允许所有的角色进行访问,也就是说不进行权限的控制
- @DenyAll和@PermitAll相反的,表示无论什么角色都不能访问
使用步骤
第一步:在spring-security.xml中开启
<security:global-method-security jsr250-annotations="enabled"></security:global-method-security>
第二步:导入maven依赖
<!--jsr250-->
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</dependency>
第三步:在指定的方法上添加注解
表示当前用户只有具备ADMIN权限才可以访问这个方法,否则会报403访问权限不足的错误
注:ADMIN前面是有个ROLE_前缀的,在这可以省略。
@RequestMapping("/findAll.do")
@RolesAllowed({"ADMIN"})
public ModelAndView findAll(@RequestParam(name = "page",required = true,defaultValue = "1")int page,@RequestParam(name = "size",required = true,defaultValue = "4") int size) throws Exception {
ModelAndView mv=new ModelAndView();
List<Product> ps=productService.findAll(page,size);
PageInfo pageInfo=new PageInfo(ps);
mv.addObject("pageInfo",pageInfo);
mv.setViewName("product-list");
return mv;
}
另外在web.xml中可以配置403出错的页面
<error-page>
<error-code>403</error-code>
<location>/403.jsp</location>
</error-page>
@Secured注解的使用
第一步:在spring-security文件中开启注解
<security:global-method-security secured-annotations="enabled" jsr250-annotations="enabled"></security:global-method-security>
第二步:在对应的方法上添加注解
注意点:与jsr-250不同的是注解中的ROLE_前缀是不可以省略的!
@RequestMapping("/findAll.do")
@Secured({"ROLE_ADMIN"})
public ModelAndView findAll(@RequestParam(name = "page", defaultValue = "1",required = true) int page,@RequestParam(name = "size",defaultValue = "4",required = true) int size) throws Exception {
ModelAndView mv=new ModelAndView();
List<Order> orderList=orderService.findAll(page,size);
PageInfo pageInfo=new PageInfo(orderList);
mv.addObject("pageInfo",pageInfo);
mv.setViewName("orders-page-list");
return mv;
}
表达式使用的介绍
第一步:在spring-security中开启配置
<security:global-method-security pre-post-annotations="enabled" secured-annotations="enabled" jsr250-annotations="enabled"></security:global-method-security>
第二步:使用,可以使用SPEL表达式
注意点:使用SPEL表达式,需要在spring-security.xml文件中将
<security:http auto-config="true" use-expressions="true">
中的use-expressions设为true
@RequestMapping("/save.do")
@PreAuthorize("authentication.principal.username=='吴许东'")//表示只有用户名为吴许东的用户可以访问
public String save(UserInfo userInfo){
userService.save(userInfo);
return "redirect:findAll.do";
}
@RequestMapping("/findAll.do")
@PreAuthorize("hasRole('ROLE_ADMIN')")//表示具有user角色的用户可以访问
public ModelAndView findAll(@RequestParam(name="page",required = true, defaultValue = "1") int page,@RequestParam(name="size",required = true,defaultValue = "4") int size){
ModelAndView mv=new ModelAndView();
List<UserInfo> userInfoList =userService.findAll(page, size);
PageInfo pageInfo=new PageInfo(userInfoList);
mv.addObject("pageInfo", pageInfo);
mv.setViewName("user-list");
return mv;
}