首页 » Java » 手把手教你玩转Shiro(2)

手把手教你玩转Shiro(2)

原文 http://blog.csdn.net/Cs_hnu_scw/article/details/79030687

2018-01-14 02:00:21阅读(531)

如果没有看第一篇关于Shiro的,可以先看看这篇文章哦,因为是一个前导知识  Shiro前导知识 ,,对于深层次理解会有很好的效果呢!而且本篇也有利用到前面写的知识点哦。~ 一:Shiro的认识

       Shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架。
既然shiro将安全认证相关的功能抽取出来组成一个框架,使用shiro就可以非常快速的完成认证、授权等功能的开发,降低系统成本。
shiro使用广泛,shiro可以运行在web应用,非web应用,集群分布式应用中越来越多的用户开始使用shiro。
java领域中spring security(原名Acegi)也是一个开源的权限管理框架,但是spring security依赖spring运行,而shiro就相对独立,最主要是因为shiro使用简单、灵活,所以现在越来越多的用户选择shiro。

手把手教你玩转Shiro(2)

架构的详细分析:

Subject
Subject即主体,外部应用与subject进行交互,subject记录了当前操作用户,将用户的概念理解为当前操作的主体,可能是一个通过浏览器请求的用户,也可能是一个运行的程序。Subject在shiro中是一个接口,接口中定义了很多认证授相关的方法,外部程序通过subject进行认证授,而subject是通过SecurityManager安全管理器进行认证授权
SecurityManager 
SecurityManager即安全管理器,对全部的subject进行安全管理,它是shiro的核心,负责对所有的subject进行安全管理。通过SecurityManager可以完成subject的认证、授权等,实质上SecurityManager是通过Authenticator进行认证,通过Authorizer进行授权,通过SessionManager进行会话管理等。
SecurityManager是一个接口,继承了Authenticator, Authorizer, SessionManager这三个接口。
Authenticator
Authenticator即认证器,对用户身份进行认证,Authenticator是一个接口,shiro提供ModularRealmAuthenticator实现类,通过ModularRealmAuthenticator基本上可以满足大多数需求,也可以自定义认证器。
Authorizer
Authorizer即授权器,用户通过认证器认证通过,在访问功能时需要通过授权器判断用户是否有此功能的操作权限。
realm
Realm即领域,相当于datasource数据源,securityManager进行安全认证需要通过Realm获取用户权限数据,比如:如果用户身份数据在数据库那么realm就需要从数据库获取用户身份信息。
注意:不要把realm理解成只是从数据源取数据,在realm中还有认证授权校验的相关的代码。
sessionManager
       sessionManager即会话管理,shiro框架定义了一套会话管理,它不依赖web容器的session,所以shiro可以使用在非web应用上,也可以将分布式应用的会话集中在一点管理,此特性可使它实现单点登录。
SessionDAO
        SessionDAO即会话dao,是对session会话操作的一套接口,比如要将session存储到数据库,可以通过jdbc将会话存储到数据库。
CacheManager
        CacheManager即缓存管理,将用户权限数据存储在缓存,这样可以提高性能。
Cryptography
Cryptography即密码管理,shiro提供了一套加密/解密的组件,方便开发。比如提供常用的散列、加/解密等功能。

二:SpringMVC+Spring+Hibernate+Shiro的整合

步骤:

第一步:整合SpringMVC+Spring+Hibernate三大框架

关于这个的话,我就不多说了,因为我之前的那一篇专题就是写的这个,如果不是很懂的就可以看一下该文章SSH框架的整合

第二步:整合Shiro

导包:shiro-core , shiro-web , shiro-sping , shiro-ehcache,shiro-quartz(任务调度)或者可以直接使用shiro-all的这个jar包,但是不建议这样使用,因为会添加多余的一些jar。

认证流程:(后面就可以按照这个过程进行配置)

手把手教你玩转Shiro(2)

(1)web.xml中添加shiro配置

<!--配置shiro-->
    <filter>
        <filter-name>shiroFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
        <init-param>
            <param-name>targetFilterLifecycle</param-name>
            <param-value>true</param-value></init-param>
    </filter>
    <filter-mapping>
        <filter-name>shiroFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

(2)Spring容器中的application.xml文件中添加shiro配置

<!--
        配置shiro的内容
    一:配置SecurityManager
    二:配置echche
    三:配置realm
    四:配置bean生命周期管理
    五:启用IOC容器的shiro注解
    六:配置ShiroFilter,其中的I必须和web,xml中的shirofileter名字一样
    -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="cacheManager" ref="cacheManager"/>
        <property name="authenticator" ref="authenticator"></property>
        <property name="realms" ref="jdbcRealm"/>
    </bean>
    <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
        <property name="cacheManagerConfigFile" value="classpath:ehcache.xml"/>
    </bean>
    <bean id="authenticator"
          class="org.apache.shiro.authc.pam.ModularRealmAuthenticator">
        <property name="authenticationStrategy">
            <bean class="org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy"></bean>
        </property>
    </bean>
    <!--配置一个realm实现类,该类实现realm接口-->
    <bean id="jdbcRealm" class="com.hnu.scw.realm.MyShiroRealm"></bean>
    <!--管理spring容器中的IOC的bean的生命周期-->
    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
    <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
          depends-on="lifecycleBeanPostProcessor"/>
    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
        <property name="securityManager" ref="securityManager"/>
    </bean>
    <!--配置shiro管理页面的控制过滤器,下面这个id必须和web.xml中配置的shiro的name一样,如果不一样就会在加载的时候报错,因为在初始化的时候,就会去找对应web.xml中的filter-name的这个name的bean,找不到就必然出错了-->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager"/>
        <!--设置登陆界面-->
        <property name="loginUrl" value="/login.jsp"/>
        <!--设置权限验证成功界面-->
        <property name="successUrl" value="/list.jsp"/>
        <!--设置权限不通过的界面-->
        <property name="unauthorizedUrl" value="/unauthorized.jsp"/>
        <!--
        	配置哪些页面需要受保护.,其实就是一个过滤链
        	以及访问这些页面需要的权限.
        	1). anon 可以被匿名访问
        	2). authc 必须认证(即登录)后才可能访问的页面.
        	3). logout 登出.
        	4). roles 角色过滤器
        -->
        <property name="filterChainDefinitions">
            <value>
                <!--
                anon表示的是能够进行匿名访问的url,这里就只设置了login.jsp可以为通过url访问
                /** 表示的是通配符的情况,其他的都要进行权限验证处理,另外可以用?匹配一个字符,*匹配多个,**匹配路径中的零个或者多个路径
                -->
                /login.jsp = anon
                /** = authc
            </value>
        </property>
    </bean>

关于上面写的那些页面的控制的内容的详细解析如下:

过滤器简称

对应的java类

anon

org.apache.shiro.web.filter.authc.AnonymousFilter

authc

org.apache.shiro.web.filter.authc.FormAuthenticationFilter

authcBasic

org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter

perms

org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter

port

org.apache.shiro.web.filter.authz.PortFilter

rest

org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter

roles

org.apache.shiro.web.filter.authz.RolesAuthorizationFilter

ssl

org.apache.shiro.web.filter.authz.SslFilter

user

org.apache.shiro.web.filter.authc.UserFilter

logout

org.apache.shiro.web.filter.authc.LogoutFilter


anon:例子/admins/**=anon 没有参数,表示可以匿名使用。

authc:例如/admins/user/**=authc表示需要认证(登录)才能使用,FormAuthenticationFilter是表单认证,没有参数

roles:例子/admins/user/**=roles[admin],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,例如admins/user/**=roles["admin,guest"],每个参数通过才算通过,相当于hasAllRoles()方法。

perms:例子/admins/user/**=perms[user:add:*],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,例如/admins/user/**=perms["user:add:*,user:modify:*"],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法。

rest:例子/admins/user/**=rest[user],根据请求的方法,相当于/admins/user/**=perms[user:method] ,其中method为post,get,delete等。

port:例子/admins/user/**=port[8081],当请求的url的端口不是8081是跳转到schemal://serverName:8081?queryString,其中schmal是协议http或https等,serverName是你访问的host,8081是url配置里port的端口,queryString

是你访问的url里的?后面的参数。

authcBasic:例如/admins/user/**=authcBasic没有参数表示httpBasic认证

ssl:例子/admins/user/**=ssl没有参数,表示安全的url请求,协议为https

user:例如/admins/user/**=user没有参数表示必须存在用户, 身份认证通过或通过记住我认证通过的可以访问,当登入操作时不做检查

注:

anon,authcBasic,auchc,user是认证过滤器,

perms,roles,ssl,rest,port是授权过滤器


这是搭建项目的JSP页面的结构:手把手教你玩转Shiro(2)

下面这是写的实现realm接口的类----------对应配置文件中的设置

package com.hnu.scw.realm;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.realm.Realm;
/**
 * @author scw
 * @create 2018-01-09 11:30
 * @desc 实现realm接口,便于shiro框架
 **/
public class MyShiroRealm implements Realm {
    @Override
    public String getName() {
        return null;
    }
    @Override
    public boolean supports(AuthenticationToken authenticationToken) {
        return false;
    }
    @Override
    public AuthenticationInfo getAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        return null;
    }
}

OK,这个就已经搭建成功了,那么我们直接运行:

手把手教你玩转Shiro(2)

那么,我们修改一下url地址,测试一下,看是否没有进行过权限验证的处理,能否进行跳转呢?

手把手教你玩转Shiro(2)

结果的话,那么就自己亲自运行一下呗~!!(其实,它会默认到login.jsp页面中去!!!原因就是没有经过权限验证处理)

三:Shiro的工作流程

描述:通过下面这个图,从而来了解shiro的验证流程。(也对上面二中出现的url访问的结果进行解析)

手把手教你玩转Shiro(2)

四:shiro的验证详解 手把手教你玩转Shiro(2)

最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹