文档章节

shiro web 登陆流程

4rnold
 4rnold
发布于 2017/09/04 16:03
字数 486
阅读 16
收藏 0

web.xml 注册filter

<!-- shiro 安全过滤器 -->
<filter>
  <filter-name>shiroFilter</filter-name>
  <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
  <async-supported>true</async-supported>
  <init-param>
    <param-name>targetFilterLifecycle</param-name>
    <param-value>true</param-value>
  </init-param>
</filter>

此处只是配置一个shiroFilterFactory,真正的filter在spring中配置

ps:这样配置将原本需要配置在web.xml中的filter配置在了spring.xml中

spring-config-shiro.xml

<!-- Shiro的Web过滤器 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
  <property name="securityManager" ref="securityManager"/>
  <property name="loginUrl" value="/login"/>
  <property name="filters">
    <util:map>
      <!--shiroFilter-->
      <entry key="authc" value-ref="formAuthenticationFilter"/>
      <entry key="sysUser" value-ref="sysUserFilter"/>
    </util:map>
  </property>
  <property name="filterChainDefinitions">
    <value>
      /login = authc
      /logout = logout
      /authenticated = authc
      /** = user,sysUser
    </value>
  </property>
</bean>

其中配置了formAuthenticationFilter

public class FormAuthenticationFilter extends AuthenticatingFilter {}
//MyFormAuthenticationFilter.java
public class MyFormAuthenticationFilter extends FormAuthenticationFilter {
    @Override
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
        if(request.getAttribute(getFailureKeyAttribute()) != null) {
            return true;
        }
        return super.onAccessDenied(request, response, mappedValue);
    }
}

如果之前的filter(验证码filter)错误了,不再继续执行 return true;

之前没错则执行onAccessDenied()。 ShiroFilterFactoryBean 具有拦截filter的能力,filters首先按web.xml配置的顺序执行,执行到ShiroFilterFactoryBean,注册shiro自己的filters,率先执行自己的filters,之后再接着执行web.xml中的filter

在FormAuthenticationFilter.onAccessDenied()

​ -> AuthenticatingFilter.executeLogin()执行登陆。

AuthenticatingFilter提供create(request,response)

AccessControlFilter提供getSubject(request,response)

​ -> (DelegatingSubject)subject.login(token)

​ -> DelegatingSubject#securityManager.login() 登陆后对subject中的属性做一些赋值

​ -> AuthenticatingSecurityManager#authenticator.authenticate()

​ -> ModularRealmAuthenticator#realms.getAuthenticationInfo()

最终落到realms上

<bean id="credentialsMatcher" class="com.github.zhangkaitao.shiro.chapter16.credentials.RetryLimitHashedCredentialsMatcher">
        <constructor-arg ref="cacheManager"/>
        <property name="hashAlgorithmName" value="md5"/>
        <property name="hashIterations" value="2"/>
        <property name="storedCredentialsHexEncoded" value="true"/>
    </bean>

    <!-- Realm实现 -->
    <bean id="userRealm" class="com.github.zhangkaitao.shiro.chapter16.realm.UserRealm">
        <property name="credentialsMatcher" ref="credentialsMatcher"/>
        <property name="cachingEnabled" value="false"/>
        <!--<property name="authenticationCachingEnabled" value="true"/>-->
        <!--<property name="authenticationCacheName" value="authenticationCache"/>-->
        <!--<property name="authorizationCachingEnabled" value="true"/>-->
        <!--<property name="authorizationCacheName" value="authorizationCache"/>-->
    </bean>

realm可以配置credentialsMatcher 在哪用?

//ModularRealmAuthenticator.java
protected AuthenticationInfo doMultiRealmAuthentication(Collection<Realm> realms, AuthenticationToken token) {

        //策略
        AuthenticationStrategy strategy = getAuthenticationStrategy();

        AuthenticationInfo aggregate = strategy.beforeAllAttempts(realms, token);

        if (log.isTraceEnabled()) {
            log.trace("Iterating through {} realms for PAM authentication", realms.size());
        }

        for (Realm realm : realms) {

            aggregate = strategy.beforeAttempt(realm, token, aggregate);

            if (realm.supports(token)) {

                log.trace("Attempting to authenticate token [{}] using realm [{}]", token, realm);

                AuthenticationInfo info = null;
                Throwable t = null;
                try {
                    info = realm.getAuthenticationInfo(token);  //试用CredentialsMatcher匹配 
                } catch (Throwable throwable) {
                    t = throwable;
                    if (log.isDebugEnabled()) {
                        String msg = "Realm [" + realm + "] threw an exception during a multi-realm authentication attempt:";
                        log.debug(msg, t);
                    }
                }

                aggregate = strategy.afterAttempt(realm, token, info, aggregate, t);

            } else {
                log.debug("Realm [{}] does not support token {}.  Skipping realm.", realm, token);
            }
        }

        aggregate = strategy.afterAllAttempts(token, aggregate);

        return aggregate;
    }

© 著作权归作者所有

共有 人打赏支持
4rnold
粉丝 1
博文 51
码字总数 26866
作品 0
深圳
程序员
从权限控制到shiro框架的应用

说明:本文很多观点和内容来自互联网以及各种资料,如果侵犯了您的权益,请及时联系我,我会删除相关内容。 权限管理 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范...

神秘的寇先森
01/01
0
0
【shiro】入门程序

Apache Shiro是一个强大的且易用的java安全框架,执行身份验证、授权、密码学和会话管理。使用Shiro的易于理解的API,可以快速,轻松的获得任何应用程序,从最小的移动应用程序到最大的网络和...

binggetong
2017/12/19
0
0
【shiro】基于url的权限管理和shiro的对比

♦基于URL的权限管理 这种是企业中比较常用的,用的是web应用中filter来实现,用户请求URL,通过filter拦截,判断用户身份是否合法(用户认证),判断请求的地址是否是用户权限范围内的URL(...

binggetong
2017/12/20
0
0
「实用教程」登录失败超过一定次数如何锁定帐号?

前言 本教程作者是「小灯光环」,作者简介:全栈开发工程师,CSDN博客专家,CSDN论坛 Java Web/Java EE版主,热爱技术,乐于分享,在分布式Web开发/Android开发/微信小程序开发/Linux系统优化...

技术小能手
08/02
0
0
Shiro之身份认证、与spring集成(入门级)

目录1.Shro的概念2.Shiro的简单身份认证实现3.Shiro与spring对身份认证的实现   前言:   Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境...

左羽
05/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

kubeadm部署kubernetes集群

一、环境要求 这里使用RHEL7.5 master、etcd:192.168.10.101,主机名:master node1:192.168.10.103,主机名:node1 node2:192.168.10.104,主机名:node2 所有机子能基于主机名通信,编辑...

人在艹木中
35分钟前
2
0
Shell特殊符号总结以及cut,sort,wc,uniq,tee,tr,split命令

特殊符号总结一 * 任意个任意字符 ? 任意一个字符 # 注释字符 \ 脱义字符 | 管道符 # #号后的备注被忽略[root@centos01 ~]# ls a.txt # 备注 a.txt[root@centos01 ~]# a=1[root@centos01...

野雪球
今天
2
0
OSChina 周二乱弹 —— 程序员圣衣

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文:分享Skeeter Davis的单曲《The End of the World》 《The End of the World》- Skeeter Davis 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
13
0
[ python import module ] 导入模块

import moudle_name ----> import module_name.py ---> import module_name.py文件路径 -----> sys.path (这里进行查找文件) # from app.web import Personimport app.web.Person as Pe......

_______-
昨天
5
0
Redis性能问题排查解决手册

一、性能相关的数据指标 通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息。通过这些信息来分析文章后面提到的一些性能指标。 nfo命令输出的数据可...

IT--小哥
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部