Shiro总结
Shiro可做哪些事:
认证、授权、加密、会话管理、与web集成、缓存等
最简单的Shiro应用是怎样运行的:
应用代码通过Subject来进行认证和授权,而Subject又委托给SecurityManager
我们需要给Shiro的SecurityManager注入Realm,从而让SecurityManager能得到合法的用户及其权限进行判断。
Apache Shiro的三大核心组件:
- Subject:当前用户的操作(所有的Subject实例都被绑定到一个SecurityManager上)
- SecurityManager:用于管理所有的Subject(Shiro架构的心脏,用来协调内部各安全组件,管理内部组件实例,并通过它来提供安全管理的各种服务)
- Realms:用于进行权限信息的验证(本质上是一个特定的DAO,必须指定至少一个Realm用来进行身份验证和授权 )
Authentication和Authorization:
在Shiro的用户权限认证过程中其通过两个方法来实现:
- Authentication:是验证用户身份的过程
- Authorization:是授权访问控制,用于对用户进行的操作进行认证授权,证明该用户是否允许进行当前操作,如访问某个链接,某个资源文件等。
其他组件:
除了上述几个组件外:Shiro还有几个组件:
- SessionManager:Shiro为任何应用提供了一个会话编程范式。
- CacheManager:对Shiro的其他组件提供缓存支持。
Shiro的优点:
- 简单你的身份认证,支持多种数据源
- 非常简单的加密API
- 对角色的简单的授权,支持细粒度的授权(方法级)
- 支持一级缓存,以提升应用程序的性能
- 内置的基于POJO企业会话管理,适用于Web以及非Web的环境
- 不跟任何的框架或者容器捆绑,可以独立运行
比较Spring Security和Apache Shiro:
- 相比Spring Security,Shiro在保持强大功能的同时,使用简单性和灵活性
- Spring Security:即便是一个一个简单的请求,最少得经过它的8个Filter
- Spring Security必须在Spring的环境下使用
- 初学Spring Security,曲线还是较大,需要深入学习其源码呵呵框架,配置起来也较费力
Shiro如何自实现认证:
Shiro的认证过程由Realm执行,SecurityManager会调用Realm包下的getAuthenticationInfo(AuthenticationToken token)方法。
实际开发中,通常提供org.apache.shiro.realm.AuthenticatingRealm 的实现类,并在该实现类中提供doGetAuthenticationInfo(AuthenticationToken token)方法的具体实现。
Shiro如何实现自实现授权:
实际开发中,通常提供org.apache.shiro.realm.AuthenticatingRealm 的实现类,并提供doGetAuthorizationInfo(PrincipalCollection principals)方法的具体实现。
配置ShiroConfig
- 创建一个方法并给注解@Bean将其交给Spring进行管理,返回类型为ShiroFilterFactoryBean类型 参数为SecurityManager securityManager
- 在方法中new ShiroFilterFactoryBean(),运用setSecurityManager()把securityManager传进去进行设置
- 运用setLoginUrl让用户在访问某个接口需要登录时跳转页面,运用setUnauthorizedUrl让用户登录后没有权限时跳转页面
- new LinkedHashMap<>();把相关路径所需的权限进行设置,之后把其交给setFilterChainDefinitionMap()中。
- 创建一个方法并给注解@Bean将其交给Spring进行管理,返回类型为SecurityManager类型的securityManager()方法,new DefaultWebSecurityManager();
- 因其securityManager可以管理各种组件,所以可以绑定各种自定义的组件,设置绑定realm推荐放到最后,不然某些情况下不生效。
Shiro有哪些组件:
- Authentication:身份认证/登录,验证用户是不是拥有相应的身份。
- Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限
- Session Manager:会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通JavaSE环境的,也可以是如Web环境的;
- Crypotgraphy:加密,保护数据的安全行,如密码加密存储到数据库,而不是明文存储;
- Web Support:Web支持,可以非常容易的集成到Web环境。
- Remember me:记住我,这是一个非常常见的功能,即一次登录后,下次再来的话不用登录了。