3.1shiro认证流程(掌握!!!)
1、subject.login(token);
token:令牌,包括账号和密码
token是根据当前用户请求的账号和密码去构造!
2、securityManager.login(token)
3、Authenticator.login(token) (重点理解部分)
Authenticator获取到用户输入的账号和密码。
Authenticator去调用realm从数据源中获取正确的账号和密码。
realm:在没有自定义realm时候,shiro使用自定义的CustomRealm。
CustomRealm通过token获取请求的账号,根据账号去查询数据。
如果CustomRealm根据用户请求的账号从数据库没有找到记录,CustomRealm给认证器返回NULL,认证器抛出异常UnknownAccountException (账号不存在)
如果CustomRealm根据用户请求的账号从数据库找到记录了,将账号对应的密码 给认证器返回,认证器拿realm返回的正确的密码 和token中输入的密码进行比对,如果一致则认证通过,否则抛出异常 IncorrectCredentialsException(密码 错误)
shiro框架的方式和spring整合来实现用户的认证
-
- web.xml中配置一个代理的对象。他会通过spring容器找到filter的工厂来找到真正的filter.
<!-- shiro过虑器,DelegatingFilterProxy通过代理模式通过spring容器中的filter工厂创建真正的 fitler -->
<filter >
<filter-name> shiroFilter</filter-name >
<filter-class> org.springframework.web.filter.DelegatingFilterProxy</filter-class >
<!-- 设置true由 servlet容器控制filter的生命周期 -->
<init-param>
<param-name> targetFilterLifecycle</param-name >
<param-value> true</ param-value>
</init-param>
<!-- 设置spring容器filter工厂的bean id,如果不设置则找与filter-name一致的bean-->
<init-param>
<param-name> targetBeanName</param-name >
<param-value> shiroFilter</param-value >
</init-param>
</filter >
<filter-mapping >
<filter-name> shiroFilter</filter-name >
<url-pattern> /*</ url-pattern>
</filter-mapping >
- applicationContext-shiro.xml中,有很多的filter。都是按顺序执行的 : anno(公开的放行 logout-->退出 auth-->必须通过认证)
- web.xml中配置一个代理的对象。他会通过spring容器找到filter的工厂来找到真正的filter.
<!-- fitler工厂,可以创建不同的 过虑器 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean" >
<property name= "securityManager" ref="securityManager" />
<!-- loginUrl会被formAuthenticationFilter判断是不是认证提交 -->
<property name= "loginUrl" value ="/login.action" />
<!-- 认证成功统一跳转到first.action,建议不配置, shiro认证成功自动到上一个请求路径 -->
<property name= "successUrl" value="/first.action" />
<property name= "unauthorizedUrl" value="/refuse.jsp" />
<!-- 自定义认证filter配置 -->
|