shiro登录流程

ShiroFilter

Shiro提供了与Web集成的支持,其通过一个ShiroFilter入口来拦截需要安全控制的URL,然后进行相应的控制,ShiroFilter类似于如Strut2/SpringMVC这种web框架的前端
其是安全控制的入口点,其负责读取配置(如ini配置文件),然后判断URL是否需要登录/权限等工作。

web.xml配置名字为shiroFilter的过滤器,这个bean去 shiro.in 或者shiro.xml配置文件中找

首先是在web.xml中配置DelegatingFilterProxy

    <!-- Shiro Security filter -->
    <filter>
        <filter-name>shiroFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
        <async-supported>true</async-supported>
    </filter>
    <filter-mapping>
        <filter-name>shiroFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>

配置好DelegatingFilterProxy后,下面只要再把ShiroFilter配置到Spring容器(此处为Spring的配置文件)即可:
(使用ShiroFilterFactoryBean创建shiroFilter)

 <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager" />
        <property name="loginUrl" value="/login" />
        <property name="successUrl" value="/" />
        <property name="filterChainDefinitions">
            <value>
                /favicon.ico = anon
                /assets/** = anon
                /jd/** = anon
                /uf/** = anon
                /upload/** = anon
                /upload-file = anon
                /api/code = anon
                /services/** = anon
                /api/login = anon
                /pushCall = anon
                /oc/** = anon
                /fl/** = anon
                /login = authc
                /logout = logout
                /api/v2/oc/user/login=anon
                /api/v2/oc/user/register=anon
                /api/v2/oc/user/checkPhoneCode=anon
                /api/v2/oc/user/reset/code=anon
                /api/v2/oc/user/reset/password=anon
                /api/v1/eam/**=mobile
                /api/v2/**=mobile
                /api/** = anon
                /** = user
            </value>
        </property>
         <!--  做拦截过滤  -->
        <property name="filters">
            <map>
                <entry key="mobile">
                    <bean class="com.xx.xx.shiro.filter.MobileAuthenticatingFilter"></bean>
                </entry>
            </map>
        </property>

    </bean>

使用了ShiroFilterFactoryBean来创建shiroFilter,这里用到了Spring中一种特殊的Bean——FactoryBean。当需要得到名为”shiroFilter“的bean时,会调用其getObject()来获取实例。下面我们通过分析ShiroFilterFactoryBean创建实例的过程来探究Shiro是如何实现安全拦截的:

ShiroFilterFactoryBean创建shiroFilter

public Object getObject() throws Exception {
    if (instance == null) {
        instance = createInstance();
    }
 return instance;
 }

其中调用了createInstance()来创建实例:


    protected AbstractShiroFilter createInstance() throws Exception {
        // 这里是通过FactoryBean注入的SecurityManager(必须)
        SecurityManager securityManager = getSecurityManager();
        if (securityManager == null) {
            String msg = "SecurityManager property must be set.";
            throw new BeanInitializationException(msg);
        }
        if (!(securityManager instanceof WebSecurityManager)) {
            String msg = "The security manager does not implement the WebSecurityManager interface."; throw new BeanInitializationException(msg);
        }
        FilterChainManager manager = createFilterChainManager();
        PathMatchingFilterChainResolver chainResolver = new PathMatchingFilterChainResolver();
        chainResolver.setFilterChainManager(manager);
        return new SpringShiroFilter((WebSecurityManager) securityManager, chainResolver);
    }

可以看到创建SpringShiroFilter时用到了两个组件:SecurityManager和ChainResolver。

先有一个大体的了解,那么对于源码分析会有不少帮助。下面会对以上两个重要的组件进行分析,包括PathMatchingFilterChainResolver和FilterChainManager。首先贴一段ShiroFilter的在配置文件中的定义:

========> ="filterChainDefinitions">
 <value> /resources/** = anon
/download/** = anon
/special/unauthorized = anon
 /register = anon
/logout = logout
/admin/** = roles[admin]
/** = user >

PathMatchingFilterChainResolver和FilterChainManager的创建过程:

protected FilterChainManager createFilterChainManager() {
 //默认使用的FilterChainManager是DefaultFilterChainManager
 DefaultFilterChainManager manager = new DefaultFilterChainManager();
// 将ShiroFilterFactoryBean配置的一些公共属性(上面配置的loginUrl,successUrl,unauthorizeUrl)应用到默认注册的filter上去
for (Filter filter : defaultFilters.values()) { applyGlobalPropertiesIfNecessary(filter);
}
Filter filters = getFilters();
if (!CollectionUtils.isEmpty(filters)) {
 for (, Filter> entry : filters.entrySet()) {
 Filter filter = entry.getValue(); applyGlobalPropertiesIfNecessary(filter);
  if (filter instanceof Nameable) {
}
//将Filter添加到manager中去,可以看到对于Filter的管理是依赖于FilterChainManager的                         manager.addFilter(name, filter, false);
}
}
 String> chains = getFilterChainDefinitionMap();
 for (String> entry : chains.entrySet()) {
 String chainDefinition = entry.getValue();
manager.createChain(url, chainDefinition); } }
return manager; }

待完成—-

时间: 2024-10-01 19:53:14

shiro登录流程的相关文章

B2C网站设计:用户注册登录流程和购买流程设计

网络购物网站根据买家和卖家的不同形态,主要分为三类商业模式:B2B  B2C  C2C ,这三种商业模式在传统的线下也有相对应的典型形态:  B2B 对应专业的批发市场  B2C 对应购物超市  C2C对应个体摊位组成的市场.所以说网络购物网站并不是完全意义上模式创新,它只是利用了新的媒介和新的平台来承载卖家和买家的商业活动,因此其网络购物购物流程和传统的是一样的,还是有借鉴意义的. 我们可以画出下面这个用户网络购物的基本流程图 这几个步骤是用户网络购物的基础环节,每个网站根据不同的需要增加相应

shiro 登录 问题?第一次点击登录按钮先进入自定义的userRealm

问题描述 shiro 登录 问题?第一次点击登录按钮先进入自定义的userRealm 第一次点击登录按钮先进入自定义的userRealm,不进controller,无法跳转:第二次点击登录按钮才能进入controller,再进入userRealm,然后正常跳转,就是说需要点击两次登录按钮才能登录成功,第一次点击登录按钮也获取到username和password.采用ajax,post提交. 哪位朋友也遇到过类似的问题,请指导!

QQ微信微博联合登录流程总结

第三方联合登录一般可以降低网站的获客成本,所以一般的网站都会做一些联合登录,常用的就是QQ.微信.微博了,下面简单的介绍一下这些联合登录的方法. 看了一号店的QQ登录源码可知,点击图标直接访问的是这个链接https://passport.yhd.com/qq/login.do?tp=2.0.0.0.0.LWyye4h-10-C`toe&ti=H2H3VT 它首先请求的是自己网站的请求,后面那两个参数应该没用,大家自己项目可以不用加,不过抓包能看出来它在服务端做了一个重定向指向了腾讯的QQ授权登录

《Oracle数据库性能优化方法论和最佳实践》——3.2 数据库登录流程的相关指标与优化

3.2 数据库登录流程的相关指标与优化 2.6节已经介绍过数据库登录流程的分解如下: Step 1:客户端登录请求. Step 2:listener处理和响应. Step 3:服务进程派生. Step 4:进程初始化和session初始化. Step 5:用户验证和权限判断. Step 6:session审计. Step 7:登录触发器. Step 8:响应客户端. 对于数据库登录流程来说,业务需求表述的输入请求和技术层面的输入请求完全一致.每次数据库登录都对应着一次客户端登录请求,输出响应时间

shiro登录时jsp页面的样式显示不出来

问题描述 shiro登录时jsp页面的样式显示不出来 shiro配置里关于样式权限配置: <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <property name=

Yii框架登录流程分析_php实例

本文详细分析了Yii框架的登录流程.分享给大家供大家参考.具体分析如下: Yii对于新手来说上手有点难度,特别是关于session,cookie和用户验证.现在我们就Yii中登录流程,来讲讲Yii开发中如何设置session,cookie和用户验证方面的一些通用知识 1. 概述 Yii是一个全栈式的MVC框架,所谓全栈式指的是Yii框架本身实现了web开发中所要用到的所有功能,比如MVC,ORM(DAO/ActiveRecord), 全球化(I18N/L10N), 缓存(caching), 基于

Yii框架的登录流程详解教程

1. 概述 Yii是一个全栈式的MVC框架,所谓全栈式指的是Yii框架本身实现了web开发中所要用到的所有功能,比如MVC,ORM(DAO/ActiveRecord), 全球化(I18N/L10N), 缓存(caching), 基于jQuery Ajax支持(jQuery-based AJAX support), 基于角色的用户验证(authentication and role-based access control), 程序骨架生成器(scaffolding), 输入验证(input va

Java二维码登录流程实现代码(包含短地址生成,含部分代码)_java

近年来,二维码的使用越来越风生水起,笔者最近手头也遇到了一个需要使用二维码扫码登录网站的活,所以研究了一下这一套机制,并用代码实现了整个流程,接下来就和大家聊聊二维码登录及的那些事儿. 二维码原理 二维码是微信搞起来的,当年微信扫码二维码登录网页微信的时候,感觉很神奇,然而,我们了解了它的原理,也就没那么神奇了.二维码实际上就是通过黑白的点阵包含了一个url请求信息.端上扫码,请求url,做对应的操作. 一般性扫码操作的原理 微信登录.支付宝扫码支付都是这个原理: 1. 请求二维码 桌面端向服务

shiro登录控制successUrl的问题

问题描述 当前使用struts2+shiro+spring进行开发,shiro控制认证和权限.在applicationContext-shiro内设置了successUrl,但是实际业务需求是根据不同的登录人,跳转至不同的页面.系统内有一个LoginAction方法Subject subject = SecurityUtils.getSubject();UsernamePasswordToken loginToken = new UsernamePasswordToken(getUserName