- 浏览: 72206 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
592386141:
有没得具体配置呢 有的话发592386141@qq.c ...
负载均衡 -
woyaowenzi:
这玩意生成出来的XML不怎么好看啊。解析也费劲。
根据对象生成XML文档 -
jidifeiyan:
忽然要开发个语音视频聊天工具,毫无头绪,学习下
FMS案例开发--视频聊天室(一)【转】 -
tongw4266:
感谢楼主的精彩分析,这个问题我也困扰了很久。我想问问的事像ha ...
集群和数据库负载均衡的研究
最近因为项目需要,研究了一下Apache Shiro安全认证框架,把心得记录下来。
(原创by:西风吹雨)
Apache Shrio是一个安全认证框架,和Spring Security相比,在于他使用了和比较简洁易懂的认证和授权方式。其提供的native-session(即把用户认证后的授权信息保存在其自身提供Session中)机制,这样就可以和HttpSession、EJB Session Bean的基于容器的Session脱耦,到到和客户端应用、Flex应用、远程方法调用等都可以使用它来配置权限认证。
1、sessionMode
在普通的WEB项目中,我们可以选择使用native session或者是HttpSession,通过设置securityManager的sessionMode参数为http或native即可。
2、realm
我们可以基于jdbc,ldap,text,activeDirectory,jndi等多种方式来获取用户基本信息,角色信息,权限信息等。只需要在 securityManager中指定使用相应的realm实现即可,其在这各方面都提供了对应的缺省实现,比如我们常用的基于数据库表的形式来配置用户 权限信息,就可以使用其缺省实现的jdbcRealm(org.apache.shiro.realm.jdbc.JdbcRealm)。当然,如果认证 信息来自于多方面,多个不同的来源(比如来自两个库中,或者一个数据库,一个是ldap,再配上一个缺省的基于文本的测试用等等),我们可以为 securityManager指定realms参数,即把这一组安全配置都配置上。各个具体的realm实现提供了方法来获取用户基本信息、角色、权限 等。
realm的授权信息可以存放在Cache中,Cache的名称可以通过设置其authorizationCacheName参数指定。
3、缓存
目前Shrio缺省提供了基于ehCache来缓存用户认证信息和授权信息的实现。只需要配置
org.apache.shiro.web.mgt.DefaultWebSecurityManager 这个 cacheManager并设置给SecurityManager即可。如果项目中已经存在使用的ehCacheManager配置(org.springframework.cache.ehcache.EhCacheManagerFactoryBean),DefaultWebSecurityManager则可以指定使用现有的ehCacheManager,如果不指定,它将自行使用缺省配置创建一个。同时,也可以设置cacheManagerConfigFile参数来指定ehCache的配置文件。
下例中的shiro.authorizationCache是用来存放授权信息的Cache,我们在配置realm(如myRealm或 jdbcReaml)时,把authorizationCacheName属性设置shiro.authorizationCache来对应。
ehcache.xml
<ehcache>
<diskStore path="java.io.tmpdir/tuan-oauth"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="false"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
/>
<!-- We want eternal="true" (with no timeToIdle or
timeToLive settings) because Shiro manages session
expirations explicitly. If we set it to false and
then set corresponding timeToIdle and timeToLive properties,
ehcache would evict sessions without Shiro's knowledge, which would
cause many problems
(e.g. "My Shiro session timeout is 30 minutes - why isn't a session
available after 2 minutes?"
Answer - ehcache expired it due to the timeToIdle property set to
120 seconds.)
diskPersistent=true since we want an enterprise session
management feature - ability to use sessions after
even after a JVM restart.
-->
<cache name="shiro-activeSessionCache"
maxElementsInMemory="10000"
eternal="true"
overflowToDisk="true"
diskPersistent="true"
diskExpiryThreadIntervalSeconds="600"/>
<cache name="shiro.authorizationCache"
maxElementsInMemory="100"
eternal="false"
timeToLiveSeconds="600"
overflowToDisk="false"/>
</ehcache>
当我们把securityManager的sessionMode参数设置为native时,那么shrio就将用户的基本认证信息保存到缺省名称为shiro-activeSessionCache 的Cache中
org.apache.shiro.web.mgt.DefaultWebSecurityManager 在sessionMode参数设置为native时,缺省使用的是DefaultWebSessionManager来管理Session,该 管理类缺省使用的是使用MemorySessionDAO基于内存来保存和操作用户基本认证信息。如果系统内的用户数特别多,我们需要使用 CacheSessionDao来基于Cache进行操作,因此,这里需要显示配置一个 sessionManager(org.apache.shiro.web.session.mgt.DefaultWebSessionManager), 并配置该sessionManager的sessionDao为 CacheSessionDao(org.apache.shiro.session.mgt.eis.CachingSessionDAO,需用其实现 类org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO)。配置CacheSessionDao时,我们可以指定属性activeSessionsCacheName的名称来替换掉缺省名 shiro-activeSessionCache。
我们再把该sessionManager配置给DefaultWebSecurityManager就可以了。
<bean id="securityManager"
class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="cacheManager"
ref="cacheManager"/>
<property name="sessionMode"
value="native"/>
<!-- Single realm app. If you have
multiple realms, use the 'realms' property instead.
-->
<property name="realm"
ref="myRealm"/>
<property name="sessionManager"
ref="sessionManager"/>
</bean>
<bean id="sessionManager"
class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
<property name="sessionDAO"
ref="sessionDAO"/>
</bean>
<bean id="sessionDAO"
class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">
<property name="activeSessionsCacheName"
value="shiro-activeSessionCache"/>
</bean>
从以上我们可以看出
a、我们可以指定sessionManager的sessionDao,在某些情况下,我们也可以通过实现自定义的sessionDao来把用户认证信息 保存在memcache,mongodb,ldap,database中,达到和其他应用共享用户认证信息的目的,以此达到SSO的目的(当 然,sessionId得一致,这个属于我们可以在应用商定怎么设定一致的sessionId的问题)。
b、cacheManager我们也可以自己实现一个,可以根据应用情况来考虑,比如存放在memcache中之类。
4、配置
Web项目中,普通的web项目可以采用ini文件来对shiro进行配置。基于spring的项目可以采用和Spring集成的方式配置。
基于Spring集成的Web项目的基本配置文件如下:
<?xml version="1.0"
encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans
"
xmlns:context="http://www.springframework.org/schema/context
"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
"
xmlns:util="http://www.springframework.org/schema/util
"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd
">
<!--
=========================================================
Shiro Core Components - Not Spring Specific
=========================================================
-->
<!-- Shiro's main business-tier object for
web-enabled applications
(use DefaultSecurityManager instead when there is no web
environment)-->
<bean id="securityManager"
class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="cacheManager"
ref="cacheManager"/>
<!-- Single realm app. If you have
multiple realms, use the 'realms' property instead.
-->
<property name="sessionMode"
value="native"/>
<property name="realm"
ref="myRealm"/>
</bean>
<!-- Let's use some enterprise caching support for
better performance. You can replace this with any
enterprise
caching framework implementation that you like (Terracotta+Ehcache,
Coherence, GigaSpaces, etc -->
<bean id="cacheManager"
class="org.apache.shiro.cache.ehcache.EhCacheManager">
<!-- Set a net.sf.ehcache.CacheManager instance here
if you already have one. If not, a new one
will be creaed with a default
config:
-->
<property name="cacheManager"
ref="ehCacheManager"/>
<!-- If you don't have a pre-built
net.sf.ehcache.CacheManager instance to inject, but you want
a specific Ehcache configuration to be used, specify that
here. If you don't, a default
will be used.:
<property name="cacheManagerConfigFile"
value="classpath:some/path/to/ehcache.xml"/>
-->
</bean>
<!-- Used by the SecurityManager to access security
data (users, roles, etc).
Many other realm implementations can be used too
(PropertiesRealm,
LdapRealm, etc. -->
<bean id="jdbcRealm"
class="org.apache.shiro.realm.jdbc.JdbcRealm">
<property name="name"
value="jdbcRealm"/>
<property name="dataSource"
ref="dataSource"/>
<property
name="credentialsMatcher">
<!-- The 'bootstrapDataPopulator' Sha256 hashes the
password
(using the username as the salt) then base64 encodes it:
-->
<bean
class="org.apache.shiro.authc.credential.Sha256CredentialsMatcher">
<!-- true means hex encoded, false means base64
encoded -->
<property name="storedCredentialsHexEncoded"
value="false"/>
<!-- We salt the password using the username, the
most common practice: -->
<property name="hashSalted"
value="true"/>
</bean>
</property>
<property name="authorizationCacheName"
value="shiro.authorizationCache"/>
</bean>
<bean id="myRealm"
class="org.apache.shiro.realm.text.IniRealm"
init-method="init">
<property name="name"
value="myRealm"/>
<property name="authorizationCacheName"
value="shiro.authorizationCache"/>
<property name="resourcePath"
value="classpath:config/myRealm.ini"/>
</bean>
<!--
=========================================================
Shiro Spring-specific integration
=========================================================
-->
<!-- Post processor that automatically invokes
init() and destroy() methods
for Spring-configured Shiro objects so you don't have to
1) specify an init-method and destroy-method attributes for every
bean
definition and
2) even know which Shiro objects require these methods to be
called. -->
<bean id="lifecycleBeanPostProcessor"
class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
<!-- Enable Shiro Annotations for Spring-configured
beans. Only run after
the lifecycleBeanProcessor has run: -->
<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>
<!-- Secure Spring remoting:
Ensure any Spring Remoting method invocations can be
associated
with a Subject for security checks. -->
<bean id="secureRemoteInvocationExecutor"
class="org.apache.shiro.spring.remoting.SecureRemoteInvocationExecutor">
<property name="securityManager"
ref="securityManager"/>
</bean>
<!-- Define the Shiro Filter here (as a FactoryBean)
instead of directly in web.xml -
web.xml uses the DelegatingFilterProxy to access this
bean. This allows us
to wire things with more control as well utilize nice Spring things
such as
PropertiesPlaceholderConfigurer and abstract beans or anything else
we might need: -->
<bean id="shiroFilter"
class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager"
ref="securityManager"/>
<property name="loginUrl"
value="/login"/>
<property name="successUrl"
value="/index"/>
<property name="unauthorizedUrl"
value="/unauthorized"/>
<!-- The 'filters' property is not necessary since
any declared javax.servlet.Filter bean
defined will be automatically acquired and available via its
beanName in chain
definitions, but you can perform overrides or parent/child
consolidated configuration
here if you like: -->
<!-- <property
name="filters">
<util:map>
<entry key="aName"
value-ref="someFilterPojo"/>
</util:map>
</property> -->
<property
name="filterChainDefinitions">
<value>
/login = authc
/account = user
/manage = user,roles[admin]
</value>
</property>
</bean>
</beans>
5、基于url资源的权限管理
我们可以简单配置在shiroFilter的filterChainDefinitions中,也可以考虑通过一个文本文件,我们读入内容后设置进去。或者通过Ini类来装入Ini文件内容,到时取出urls的部分来设置给shiroFilter的filterChainDefinitions。也可以把这部分数据存入数据库表中,到时读出一个Map来设置给shiroFilter的filterChainDefinitionsMap属性。
6、url的配置
authc是认证用户(rememberMe的用户也必须再次登录才能访问该url),配置成user才能让rememberMe用户也可以访问。
7、rememberMe Cookie的处理
Shiro有一套缺省机制,由CookieRememberMeManager实现。
其有一个SimpleCookie类,保存对应的用户信息等。每次保存时,系统把SimpleCookie的信息设置好之后,先用DefaultSerializer把其用jvm缺省序列化方式序列化成byte[],然后再用cipherService(缺省是aes加密算法)来加密该byte[],最后用Base64.encodeToString(serialized)压缩成一个字符串,再写入名称为rememberMe的Cookie中。
读取时,通过把该rememberMe Cookie的内容用byte[] decoded = Base64.decode(base64)解压出该byte[],再用cipherService解密,最后用DefaultSerializer反序列化出来该SimpleCookie类。
如果我们有自定义的rememberMe Cookie需要处理,特别是在和其他网站一起SSO,通过访问主域的Cookie来获取记录的用户信息时,我们需要重新实现rememberMeManager(可以考虑继承AbstractRememberMeManager), 和根据实际用的序列化方式Serializer来实现一个(比如考虑通用性,用json方式序列化)。在Spring配置中,配置好 RememberMeManager,装配上sericerlizer和cipherService(根据实际情况选用适当的加密算法),最后把 rememberMeManager设置给DefaultWebSecurityManager即可。如果非常简单的cookie,可以直接实现RememberMeManager的几个接口方法也行。
说到这里, Apache Shiro的一些基本配置和扩展情况应该差不多了。关于它的授权和使用等模型,其官网有基本的说明,也有相关的例子。这里主要是针对其实际应用中的一些使用和扩展方式。
原文链接:http://blog.sina.com.cn/s/blog_6638b10d0100pd88.html
发表评论
-
java xml处理(dom4j,xstream,jdom,xmlbean),Content is not allowed in prolog异常解决
2012-11-29 19:05 1543因由:做一个程序,过程中需要解析自定义的xml文件(utf-8 ... -
深入分析 Java 中的中文编码问题[转]
2012-11-13 10:14 598几种常见的编码格式 为什么要编码 不知道大家有没有想 ... -
JSR 303 - Bean Validation 介绍及最佳实践 【转】
2012-06-18 16:30 811原文链接:http://www.ibm.com/develop ... -
OSGi入门必读系列
2012-06-07 23:28 757http://developer.51cto.com/art/ ... -
AOP 的利器:ASM 3.0 介绍【转】
2012-03-28 01:00 745引言 什么是 ASM ? ... -
Shrio入门相关
2012-03-26 15:05 902应用Shiro到Web Application http ... -
根据对象生成XML文档
2011-07-15 11:03 1909根据对象生成XML文档. 使用Java提供的java.bean ... -
用JAXB从对象生成XML
2011-07-15 11:03 1143Java代码 import java.i ... -
理解ThreadLocal
2010-09-12 14:09 674ThreadLocal是什么 早在JDK 1.2的版本中就提 ...
相关推荐
安全认证框架-Apache_Shiro研究心得
安全认证框架-Apache_Shiro,综合学习笔记
人工智能-项目实践-检测-Apache Shiro 反序列化漏洞检测与利用工具 Shiro_exploit Shiro_exploit用于检测与利用Apache Shiro反序列化漏洞脚本。可以帮助企业发现自身安全漏洞。 该脚本通过网络收集到的22个key,...
061-Apache Shiro 反序列化之殇.pdf
apache shiro轻量级的安全认证授权框架让你快速搭建中下型企业安全认证模块
thymeleaf-extras-shiro, 用于 Apache Shiro标记的Thymeleaf方言 thymeleaf-extras-shiro Shiro的Thymeleaf 方言, 。下载 Maven<dependency> <groupId>com.github.th
CVE-2016-4437 Shiro550 & Shiro721 RememberMe Padding Oracle ...- Apache Shiro 1.2.5,1.2.6,1.3.0,1.3.1,1.3.2,1.4.0-RC2,1.4.0,1.4.1 CVE-2016-4437 Shiro550影响版本: - Apache Shiro exp: ``` GUI
关于java的安全框架-----Apache Shiro,是一个pdf,介绍还不错!
springboot-shiro认证系统框架--成型框架,认证中心服务,分布式框架,可以直接使用,配置多元化,组件化,只需修改配置文件,达到相应需求,适合生产开发,开发学习
Apache Shiro是一个功能强大、灵活的开放式安全框架,干净利落地处理身份验证、授权、企业会话管理和加密。 Shiro可以帮助我们完成:认证、授权、加密、会话管理、与Web集成、缓存等。 【apache-shiro-1-2-x-...
权限管理Shiro系统-Apache开源顶级项目shiro-SpringMVC_Shiro项目
Apache Shiro 身份认证例子-源码
SpringMVC-Mybatis-Shiro-redis-master..............
基于SpringMVC Mybatis Shiro Redis 的权限管理系统,该系统已经部署到线上,线上访问地址:http://shiro.itboy.net,登录账号:admin 密码:sojson,,详细教程参考sojson.com/shiro
Apache Shiro 是一个框架,可用于身份验证和授权。Apache Shiro的教程(PDF),相关jar包,源码等。
shiro 安全框架--最好的中文配置文档,讲了shiro的配置步骤
springboot、shiro、mybatis、mybatis plus、mysql、thymeleaf、 3、实现功能:登陆认证、密码加密、权限授权等 4、优点:快速上手、全面支持验证、授权、加密和会话、灵活自定义设计、支持web环境、可以无缝集成...
Apache Shiro。 官网 Apache Shiro API。 Apache Shiro开发文档。
如果要使用shiro的话,可以引入 thymeleaf-extras-shiro.jar这个拓展包来曲线实现shiro的前端验证
Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能。 使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。