控制方法访问的注解使用

  • 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的三种注解:

  1. @RolesAllowed:表示访问对应方法时所应具有的角色
    示例:@RolesAllowed({“User”,“ADMIN”}) 该方法只要具有"User","Admin"任意一种权限就可以访问。这里可以省略前缀ROLE_,实际的权限可能是ROLE_ADMIN
  2. @PermitAll表示允许所有的角色进行访问,也就是说不进行权限的控制
  3. @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;
    }