侧边栏壁纸
博主头像
张种恩博主等级

一个能运维的 JPG 搬运工

  • 累计撰写 703 篇文章
  • 累计创建 60 个标签
  • 累计收到 24 条评论

安全/权限框架Shiro(12)之权限注解

张种恩
2018-06-22 / 0 评论 / 0 点赞 / 308 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2020-02-25,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

介绍

权限注解的作用就是修饰一个方法,让这个方法只有在当前 Subject 满足一定的条件时才能访问。

  • @RequiresAuthentication :当前 Subject 已经通过 login 进行了身份验证,即 Subject.isAuthenticated 方法返回 true 时。
  • @RequiresUser :当前 Subject 已经身份验证或通过“记住我”自动登录。
  • @RequiresGuest :当前 Subject 没有身份验证(包含通过“记住我”登录),为游客身份时。
  • @RequiresRoles(value={"admin","user"},logical=Logical.AND) :当前 Subject 需要拥有角色 adminuser
  • @RequiresPermissions(value={"user:a","user.b"},logical=Logical.OR) :当前 Subject 需要拥有权限 user:auser:b

使用示例

1、新建测试使用的 Controller 并使用 Shiro 注解:

// com.zze.shiro.controller.TestController
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class TestController {

    @RequestMapping("testHasRole")
    @RequiresRoles({"admin"})  // 只有拥有 admin 角色的用户才可以访问
    public String testHasRole() {
        System.out.println("from testHasRole");
        return "redirect:list.jsp";
    }
}

2、修改 list.jsp

<!-- list.jsp -->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
Welcome 【<shiro:principal/>】 <br>
<h3>List Page</h3>

<a href="/user.jsp">user</a> <br>
<a href="/admin.jsp">admin</a><br>
<a href="/logout">logout</a><br>
<a href="/testHasRole">testHasRoleAnno</a>
</body>
</html>

3、测试以 admin 用户登录,访问 localhost:8080/testHasRole ,正常访问。

4、测试以 user 用户登录,访问 localhost:8080/testHasRole ,抛出如下异常:

image.png

此时我们就可以通过 SpringMVC 的【全局异常处理】来捕获这个异常,给用户返回友好的页面。

如注解失效,需要将下面配置移到 SpringMVC 核心配置文件中:

<!--
配置 lifecycleBeanPostProcessor,可以自动调用配置在 Spring IOC 容器中 Shiro bean 的生命周期方法
-->
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>

<!--
启用 IOC 容器中使用 Shiro 注解,必须在配置 lifecycleBeanPostProcessor 之后才可使用
-->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
      depends-on="lifecycleBeanPostProcessor"/>

<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
    <property name="securityManager" ref="securityManager"/>
</bean>
0

评论区