权限项目总结(三) shiro 认证

认证是shiro在使用过程中最开始的一个步骤,只有通过了认证才回有下面授权等操作。认证就是shiro获取当前

用户凭据并进行匹配的过程,最朴素的理解就是弄清楚当前用户的到底是谁的过程。这里也是针对在应用层面的总结,因为发现跟到shiro内部东西就很多了,容易迷失自己。

其实shiro认证过程简化的步骤非常简单

1.提交凭据

2.获取验证信息

3.验证凭据和验证信息是否一致

看一下详细的步骤

粗略的跟了一下shiro认证的流程,处理流程如下。

流程中省去了提交表单获取凭据的过程,也省去了在自定义realm的过程,咱们直接看从代理类

DelegatingSubject开始login的过程。

第一步:调用默认securityManager,DefaultSecurityManager这个主要是shiro认证、授权、会话管理等操作的包装类。常见的Facade模式。

第二步:之后调用DefaultSecurityManager继承SessionsSecurityManager执行login方法

第三步:认证管理器AuthenticatingSecurityManager继承RealmSecurityManager执行authenticate方法:

第四步:抽象认证管理器AbstractAuthenticator继承Authenticator,
LogoutAware 执行authenticate方法:

第五步:ModularRealmAuthenticator继承AbstractAuthenticator执行doAuthenticate方法

第六步:AuthenticatingRealm继承CachingRealm执行getAuthenticationInfo方法

第七步:最后在调用SimpleCredentialsMatcher的doCredentialsMatch()

我们可以看一下这个doCredentialMatch(),特别有意思。

publicclass SimpleCredentialsMatcher extends CodecSupport implementsCredentialsMatcher {
//log处理
    private static final Logger log =LoggerFactory.getLogger(SimpleCredentialsMatcher.class);

  //得到提交的凭据
    protected ObjectgetCredentials(AuthenticationToken token) {
        return token.getCredentials();
    }

//得到存在于数据库的凭据
    protected ObjectgetCredentials(AuthenticationInfo info) {
        return info.getCredentials();
    }

                 //验证提交的token和存在于数据库中的凭据信息是否一致
    protected boolean equals(ObjecttokenCredentials, Object accountCredentials) {
        if (log.isDebugEnabled()) {
            log.debug("Performingcredentials equality check for tokenCredentials of type [" +
                   tokenCredentials.getClass().getName() + " and accountCredentials oftype [" +
                   accountCredentials.getClass().getName() + "]");
        }
        if (isByteSource(tokenCredentials)&& isByteSource(accountCredentials)) {
            if (log.isDebugEnabled()) {
                log.debug("Bothcredentials arguments can be easily converted to byte arrays.  Performing " +
                        "array equalscomparison");
            }
            byte[] tokenBytes =toBytes(tokenCredentials);
            byte[] accountBytes =toBytes(accountCredentials);
            return Arrays.equals(tokenBytes,accountBytes);
        } else {
            returnaccountCredentials.equals(tokenCredentials);
        }
    }
  //验证是否一致
    public booleandoCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {
        Object tokenCredentials =getCredentials(token);
        Object accountCredentials =getCredentials(info);
        return equals(tokenCredentials,accountCredentials);
    }

}

这个类应该说不是很复杂,没有各种的设计原则和模式,仅仅是判断。走到最后发现shiro认证在刨去一些调用

和封装之外,落实到最后的还是我们常见的哪些判断、选择、顺序这些常用的代码结构设计。也是一件很有意

思的事情。

走完了一些处理的流程,下面主要针对shiro+spring如何结合使用来整理一下。

整合spring

<!--1.配置shiro的DelegatingFilterProxy,对于shiro里filter的代理,这个类的好处就是通过spring来管理shiro中的filter类 -->
<beanid="shiroFilter"class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<propertyname="securityManager" ref="securityManager" />
<propertyname="loginUrl" value="/login.jsp" />
<propertyname="successUrl" value="/login.jsp" />
<propertyname="unauthorizedUrl" value="/error/noperms.jsp" />

<!-- url过滤器 -->
<propertyname="filterChainDefinitions">
<value>
/login.jsp*= anon
/login.do*= anon
/index.jsp*=anon
/error/noperms.jsp*=anon
/*.jsp*= authc
/*.do*= authc
</value>
</property>
</bean>
 

通过配置将shiro所有的过滤器都交给spring来管理,类似于struts2,shiro的filer有11个。

上图表摘自:

http://www.baidu.com/link?url=-EzqJe6QFf7QEf8AF7bbETApsjBuulcLUcIxROOr8hmtfvp8KHD8brzcrBKNQCr1dJGJLCICdv4t9CMTK-i45a

<!--        2.配置securityManager,securityManager为调用shiro内部各个realm的入口-->
<beanid="securityManager"class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!--设置自定义realm-->
<propertyname="realm" ref="monitorRealm" />

</bean>
<!--3.自定义Realm继承自AuthorizingRealm -->
<beanid="monitorRealm"class="com.shiro.service.MonitorRealm"></bean>

<!--4.注入securityManager类的arguments属性-->
<beanclass="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<propertyname="staticMethod"value="org.apache.shiro.SecurityUtils.setSecurityManager" />
<propertyname="arguments" ref="securityManager" />
</bean>
 

以上主要是shiro认证流程处理,加上后面shiro如何和spring结合使用的配置。主要是这两个部分:

.通过shiro时序图可以发现其实shiro没有想象复杂的,当然其中一些调用类的包装还是挺多的。但是最为基础的认证还是比较简单的,这里仅仅是比较简单的认证。

.shiro和spring的结合主要在于shirofilterfactorybean的配置以及自定义realm的配置。

时间: 2024-10-08 01:37:00

权限项目总结(三) shiro 认证的相关文章

JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法、shiro认证与shiro授权

shiro介绍 什么是shiro shiro是Apache的一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权.加密.会话管理等功能,组成了一个通用的安全认证框架.它可以实现如下的功能: 1.验证用户 2.对用户执行访问控制,如:判断用户是否具有角色admin,判断用户是否拥有访问的资源权限. 3.在任何环境下使用SessionAPI.例如C/S程序 4.可以使用多个用户数据源.例如一个是Oracle数据库,另外一个是MySQL数据库. 5.单点登录(SSO)功能

Shiro权限管理框架(三):Shiro中权限过滤器的初始化流程和实现原理

本篇是Shiro系列第三篇,Shiro中的过滤器初始化流程和实现原理.Shiro基于URL的权限控制是通过Filter实现的,本篇从我们注入的ShiroFilterFactoryBean开始入手,翻看源码追寻Shiro中的过滤器的实现原理. 初始化流程 ShiroFilterFactoryBean实现了FactoryBean接口,那么Spring在初始化的时候必然会调用ShiroFilterFactoryBean的getObject()获取实例,而ShiroFilterFactoryBean也在

权限项目总结(四) shiro 授权

概述 Authorization(授权):不难理解,授权就是用来控制当前訪问用户在訪问系统资源权限. 这个词也做证书的解释,从证书这个角度来讲,推断是否拥有对资源訪问的权限时.当前用户须要提供证书. 授权的核心 用户-角色-权限,以角色为中心.普通情况将权限分配给某个角色.然后给用户分配某个权限或是一组权限. 主要的流程 当前用户调用isPermitted方法,携带着当前用户訪问资源的路径,通常是字符串或者是集合. 调用自己定义的Realm类的重写方法 doGetAuthorizationInf

shiro权限项目中的简单应用

SpringMVC+maven 项目需要使用shiro,所以自学了几天,仅提供给新手,请根据文档查看-该项目仅是测试项目,并不完善,只实现了需要使用的基本功能,并且只提供了使用shiro模块的代码.楼主新人第一次写,如有问题希望能提出来,由衷的感谢. 首先是pom.xml: <dependency>     <groupId>org.apache.shiro</groupId>     <artifactId>shiro-core</artifactI

在前后端分离的SpringBoot项目中集成Shiro权限框架

项目背景 公司在几年前就采用了前后端分离的开发模式,前端所有请求都使用ajax.这样的项目结构在与CAS单点登录等权限管理框架集成时遇到了很多问题,使得权限部分的代码冗长丑陋,CAS的各种重定向也使得用户体验很差,在前端使用vue-router管理页面跳转时,问题更加尖锐.于是我就在寻找一个解决方案,这个方案应该对代码的侵入较少,开发速度快,实现优雅.最近无意中看到springboot与shiro框架集成的文章,在了解了springboot以及shiro的发展状况,并学习了使用方法后,开始在网上

(转) shiro权限框架详解04-shiro认证

http://blog.csdn.net/facekbook/article/details/54906635 shiro认证 本文介绍shiro的认证功能 认证流程 入门程序(用户登录和退出) 自定义Realm 散列算法 认证流程 开始构造SecurityManager环境subject.login();提交认证securityManager.login()执行认证Authenticator执行认证Realm根据身份获取验证信息结束 入门程序(用户登录和退出) 创建Java项目 jdk版本:1

快速构建一个权限项目(三)

如何构建一个权限项目这里接着我们上次说的来编写代码,我们这个点主要讲的是接口请求全局异常处理, 接下来跟我一起看我编写的代码如何实现的,首先我们要定义一个全局异常的处理类,在common包下建一个类SpringExceptionResolver: package cn.oyc.common; import cn.oyc.exception.ParamException; import cn.oyc.exception.PermissionException; import lombok.exte

将 Shiro 作为应用的权限基础 一:shiro的整体架构

将 Shiro 作为应用的权限基础 一:shiro的整体架构 近来在做一个重量级的项目,其中权限.日志.报表.工作量由我负责,工作量还是蛮大的,不过想那么多干嘛,做就是了. 这段时间,接触的东西挺多,比如apacheshiro,spring data,springside.DWZ等,java的东西好多,学过ssh就像当初学过三层一样. 下面看看这个安全框架吧 一.什么是Shiro Shiro是一个强大而灵活的开源安全框架,能够非常清晰的处理认证.授权.管理会话以及密码加密.如下是它所具有的特点:

【shiro】(4)---Shiro认证、授权案例讲解

Shiro认证.授权案例讲解 一.认证  1. 认证流程     2.用户密码已经加密.加盐的用户认证 (1)测试类 // 用户登陆和退出,这里我自定了一个realm(开发肯定需要自定义realm获取数据库密码和权限) @Test public void testCustomRealmMd5() { // 创建securityManager工厂,通过ini配置文件创建securityManager工厂 Factory<SecurityManager> factory = new IniSecu