shiro权限注解和会话管理

1.shiro权限注解

注解可以放在controller对应的方法上,也可以放在service层对应的方法上。

@RequiresAuthentication:表示当前Subject已经通过login进行了身份验证;即Subject.isAuthenticated()返回true。

@RequiresUser:表示当前Subject已经身份验证或者通过记住我登录的。

@RequiresGuest:表示当前Subject没有身份验证或通过记住我登录过,即是游客身份。

@RequiresRoles(value={“admin”,“user”},logical=Logical.AND):表示当前Subject需要角色admin和user。

@RequiresPermissions(value={“user:a”,“user:b”},logical=Logical.OR):表示当前Subject需要权限user:a或user:b。

1.1简单实验

(1)编写ShiroService.java

@Service
public class ShiroService {
    @RequiresRoles({"admin"})
    public void testMethod(){
        System.out.println("testMethod, time: " + new Date());

        Session session = SecurityUtils.getSubject().getSession();
        Object val = session.getAttribute("key");

        System.out.println("Service SessionVal: " + val);
    }
}

(2)编写controller

@Autowired
    private ShiroService shiroService;

    @RequestMapping("/testShiroAnnotation")
    public String testShiroAnnotation(HttpSession session){
        session.setAttribute("key", "value12345");
        shiroService.testMethod();
        return "redirect:/list.jsp";
    }

(3)为方便起见,在list.jsp中测试。

<br><br>
<a href="shiro/testShiroAnnotation">Test ShiroAnnotation</a>

测试结果:

当我们使用admin登录时,我们可以点击测试。当我们使用user登录时,会报错误。

shiro权限注解和会话管理

 1.2注意事项

(1)可能会出现shiro注解失效的问题,解决方法就是在springmvc的配置文件中加上如下配置:

 <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor">
        <property name="proxyTargetClass" value="true" />
    </bean>

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

(2)在实际开发的时候,我们往往在service上面加上支持事务的注解,这个时候service已经是一个代理对象了。如果我们还在这里添加shiro的注解就不好用了,故在这种情况下应该加在controller上,否则会出现异常。

2.shiro会话管理

Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如web容器tomcat),不管JavaSE还是JavaEE环境都可以使用,提供了会话管理、会话事件监听、会话存储/持久化、容器无关的集群、失效/过期支持、对Web的透明支持、SSO单点登录的支持等特性。

在1.1实验中,已经含有session的简单实验(下图为控制台的打印)。这里我们在controller中使用的是http session,而在service中使用shiro session获取,这给我们提供了一个思路,我们在service中可以获得controller中的数据,这也是shiro session的一个重要的应用场景。

shiro权限注解和会话管理

 参考:尚硅谷

上一篇:如何给 Flutter 有状态组件(StatefulWidget)传参?


下一篇:调用 StatefulWidget 组件的参数时(widget.xxx)报 Invalid Constant Value