Shiro是Apache的一个开源框架,提供了认证、授权、加密、会话管理、与Web集成、缓存等功能。Shiro属于轻量框架,不仅可以实现web应用的权限管理,还可以实现c/s系统,分布式系统权限管理。
基本功能
Authentication身份认证,登录时使用,验证用户是否存在。Authorization授权,验证用户是否拥有某个权限。Session Manager会话管理。用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中。Cryptography加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储。Web SupportWeb支持,可以非常容易的集成到Web环境。Caching缓存。用户登录后,其用户信息、拥有的角色、权限不必每次去查数据库,这样可以提高效率。ConcurrencyShiro支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去。Testing提供测试支持。Run As允许一个用户假装为另一个用户(如果他们允许)的身份进行访问。Remember Me记住我。一次登录后,下次不用登录。核心组件
Subject代表当前用户,与当前应用交互的任何东西都是Subject,如网络爬虫,机器人等。SecurityManager安全管理器,是Shiro的核心。管理着所有Subject,所有与安全有关的操作都会与SecurityManager交互。如果学习过SpringMVC,可以把它看成DispatcherServlet。Realm相当于数据源,通过Realm认证、授权相关数据。一般情况下在项目中需要自定义Realm,重写认证和授权的方法。Shiro不提供维护用户/权限,而是通过Realm让开发人员自己注入。
认证原理
1.创建SecurityManager。2.调用Subject.login方法提交认证。3.SecurityManager调用IniRealm进行认证。4.接收IniRealm返回Authentication认证信息。授权原理
1.对Subject进行授权,调用方法isPermitted("permission串")。2.SecurityManager执行授权,通过ModularRealmAuthorizer执行授权。3.ModularRealmAuthorizer调用自定义的Realm.doGetAuthorizationInfo从数据库中查询权限。4.ModularRealmAuthorizer调用PermissionResolver进行权限串比对。5.对比时,通过isPermitted中"permission串"进行校验,如果没有权限,抛出异常。Shiro的授权方式
1.通过写if/else代码块完成。(这种比较少用,一般在项目中采用后两种)Subject subject = SecurityUtils.getSubject();if(subject.hasRole(“admin”)) { //有权限} else { //无权限}2.注解。@RequiresPermissions("system:operator:list")public Object list() { //有权限}3.JSP/GSP标签。<%@ taglib uri="http://shiro.apache.org/tags" prefix="shiro" %><shiro:authenticated> - 登录之后<shiro:notAuthenticated> - 不在登录状态时<shiro:guest> - 用户在没有RememberMe时<shiro:user> - 用户在RememberMe时<shiro:hasAnyRoles name="abc,123" > - 在有abc或者123角色时<shiro:hasRole name="abc"> - 拥有角色abc<shiro:lacksRole name="abc"> - 没有角色abc<shiro:hasPermission name="abc"> - 拥有权限资源abc<shiro:lacksPermission name="abc"> - 没有abc权限资源<shiro:principal> - 显示用户身份名称<shiro:principal property="username"/> - 显示用户身份中的属性值<shiro:hasRole name="admin"><!— 有admin角色权限 —></shiro:hasRole>