安全管理器
通常使用DefaultSecurityManager,在web应用中使用其子类DefaultWebSecurityManager。 DefaultWebSecurityManager实现了WebSecurityManager接口,该类添加了关于session的使用。 DefaultSecurityManager主要实现了SecurityManager的行为login()、logout()、createSubject()。 Spring中配置securityManager:
<!-- 配置securityManager 安全管理器-->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="myRealm"></property>
<property name="sessionManager" ref="sessionManager"></property>
<property name="rememberMeManager" ref="rememberMeManager"></property>
</bean>
会话管理器
所谓会话,即用户访问应用时保持的连接关系,在多次交互中应用能够识别出当前访问的用户是谁,且可以在多次交互中保存一些数据。如访问一些网站时登录成功后,网站可以记住用户,且在退出之前都可以识别当前用户是谁。
登录成功后使用Subject.getSession()即可获取会话;其等价于Subject.getSession(true),即如果当前没有创建Session对象会创建一个;另外Subject.getSession(false),如果当前没有创建Session则返回null(不过默认情况下如果启用会话存储功能的话在创建Subject时会主动创建一个Session)。
会话管理器管理着应用中所有Subject的会话的创建、维护、删除、失效、验证等工作。是Shiro的核心组件,顶层组件SecurityManager直接继承了SessionManager,且提供了SessionsSecurityManager实现直接把会话管理委托给相应的SessionManager,DefaultSecurityManager及DefaultWebSecurityManager默认SecurityManager都继承了SessionsSecurityManager。
Shiro提供了三个默认实现:
DefaultSessionManager:DefaultSecurityManager使用的默认实现,用于JavaSE环境;
ServletContainerSessionManager:DefaultWebSecurityManager使用的默认实现,用于Web环境,其直接使用Servlet容器的会话;
DefaultWebSessionManager:用于Web环境的实现,可以替代ServletContainerSessionManager,自己维护着会话,直接废弃了Servlet容器的会话管理。 在Spring中配置sessionManager
<!-- 配置sessionManager 配置后会取代servlet的session,使其不起作用
使用SericytyUtil.getSubject().getSession()方法获取
session对象,使用方法与之前一样 -->
<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<property name="deleteInvalidSessions" value="true"></property><!-- 清空无效session -->
<property name="globalSessionTimeout" value="18000000"></property><!-- 超时时限 ms -->
</bean>
Ini配置文件配置:
sessionIdCookie=org.apache.shiro.web.servlet.SimpleCookie
sessionManager=org.apache.shiro.web.session.mgt.DefaultWebSessionManager
sessionIdCookie.name=sid
sessionIdCookie.maxAge=1800
sessionIdCookie.httpOnly=true
sessionManager.sessionIdCookie=$sessionIdCookie
sessionManager.sessionIdCookieEnabled=true
securityManager.sessionManager=$sessionManager
多个Realm的使用
当用用程序需要配置多个Realm时,设置安全管理器中的realms属性,添加多个自定义realm,当有多个realm时就需要执行策略决定是否认证授权成功。
发现需要在执行认证的时候,需要策略来处理多个realm存在的情况。
默认实现类有三个策略:
1. AtLeastOneSuccessfulStrategy :如果一个(或更多)Realm 验证成功,则整体的尝试被认为是成功的。如果没有一个验证成功,则整体尝试失败。
2. FirstSuccessfulStrategy 只有第一个成功地验证的Realm 返回的信息将被使用。后面的realm会被忽略,如果一个都没有成功则失败。
3. AllSucessfulStrategy 为了整体的尝试成功,所有配置的Realm 必须验证成功。如果没有一个验证成功,则整体尝试失败。 ModularRealmAuthenticator 默认的是AtLeastOneSuccessfulStrategy Spring中配置:
<bean id="authenticator"
class="org.apache.shiro.authc.pam.ModularRealmAuthenticator">
<property name="authenticationStrategy">
<bean class="org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy"></bean>
</property>
</bean>
在安全管理器中设置
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realms">
<list>
<ref bean="firstRealm"/>
<ref bean="secondRealm"/>
</list>
</property>
<property name="authenticator" ref="authenticator"></property>
rememberMe
实现一段时间内免登录。 设置cookie和rememberMe。
<!-- 配置cookie-->
<bean id="simpleCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<property name="maxAge" value="604800"></property><!-- 最大时间 s -->
<property name="name" value="rememberMe"></property><!-- cookie名称 -->
</bean>
<!-- 配置rememberMe -->
<bean id="rememberMeManager" class&