Shiro是什么:
Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能。认证和授权为权限控制的核心,简单来说,“认证”就是证明你是谁? Web 应用程序一般做法通过表单提交用户名及密码达到认证目的。“授权”即是否允许已认证用户访问受保护资源。
Shiro能做什么:
认证(Authentication):验证用户来核实他们的身份
授权(Authorization):对用户执行访问控制,如:判断用户是否被分配了一个确定的安全角色,判断用户是否被允许做某事
会话管理(Session Management):在任何环境下使用Session API
加密(Cryptography):以更简洁易用的方式使用加密的功能,保护或隐藏数据防止被偷窥
shiro与spring集成:
第一步:配置web.xml
<!-- 配置Shiro过滤器,先让Shiro过滤系统接收到的请求 --> <!-- 这里filter-name必须对应applicationContext.xml中定义的<bean id="shiroFilter"/> --> <!-- 使用[/*]匹配所有请求,保证所有的可控请求都经过Shiro的过滤 --> <!-- 通常会将此filter-mapping放置到最前面(即其他filter-mapping前面),以保证它是过滤器链中第一个起作用的 --> <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>
第二步:配置spring-shiro.xml
<!-- 继承自AuthorizingRealm的自定义Realm,即指定Shiro验证用户登录的类为自定义的richwaySystemRealm.java --> <bean id="richwaySystemRealm" class="com.richway.system.service.RichwaySystemRealm"></bean> <!-- Shiro默认会使用Servlet容器的Session,可通过sessionMode属性来指定使用Shiro原生Session --> <!-- 即<property name="sessionMode" value="native"/>,详细说明见官方文档 --> <!-- 这里主要是设置自定义的单Realm应用,若有多个Realm,可使用'realms'属性代替 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <!--设置自定义realm --> <property name="realm" ref="richwaySystemRealm" /> <property name="cacheManager" ref="ehCacheShiro"></property> </bean> <!-- Shiro主过滤器本身功能十分强大,其强大之处就在于它支持任何基于URL路径表达式的、自定义的过滤器的执行 --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <!-- Shiro的核心安全接口,这个属性是必须的 --> <property name="securityManager" ref="securityManager" /> <!-- 要求登录时的链接,非必须的属性,默认会自动寻找Web工程根目录下的"/login.jsp"页面 --> <property name="loginUrl" value="/login.jsp" /> <!-- 用户访问未对其授权的资源时,所显示的连接 --> <property name="unauthorizedUrl" value="/error.jsp" /> <property name="filterChainDefinitions"> <value> <!-- Anon:不指定过滤器 Authc:验证,这些页面必须验证后才能访问,也就是我们说的登录后才能访问。--> /login.jsp = anon /error.jsp= anon /system/*.jsp = authc /success.jsp = authc </value> </property> </bean> <bean id="ehCacheShiro" class="org.apache.shiro.cache.ehcache.EhCacheManager"> <property name="cacheManagerConfigFile" value="classpath:config/ehcache-shiro.xml"/> </bean>
第三步:配置 ehcache-shiro.xml
<!-- name:缓存名称。 maxElementsInMemory:缓存最大个数。 eternal:对象是否永久有效,一但设置了,timeout将不起作用。 timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。 timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。 overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。 diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。 maxElementsOnDisk:硬盘最大缓存个数。 diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false. diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。 memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。 clearOnFlush:内存数量最大时是否清除。 --> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" maxElementsOnDisk="10000000" diskPersistent="false" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU" /> </ehcache>
第四步:在sqlserver数据库中新建数据库test和SYS_USER表
写道
CREATE TABLE [dbo].[SYS_USER](
[id] [varchar](32) NOT NULL,
[username] [varchar](50) NULL,
[password] [varchar](50) NULL,
[sex] [varchar](10) NULL,
[phone] [varchar](50) NULL,
[addr] [varchar](100) NULL,
[tm] [datetime] NULL,
CONSTRAINT [PK_SYS_USER] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
[id] [varchar](32) NOT NULL,
[username] [varchar](50) NULL,
[password] [varchar](50) NULL,
[sex] [varchar](10) NULL,
[phone] [varchar](50) NULL,
[addr] [varchar](100) NULL,
[tm] [datetime] NULL,
CONSTRAINT [PK_SYS_USER] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
附件中给出了我整理的一个shirodemo的例子(使用了spring mvc和spring jpa hibernate的实现),配置文件中增加了spring-mvc.xml的配置和spring jpa 中persistence.xml、applicationContext.xml的配置。如需要可下载。
相关jar包下载地址:http://pan.baidu.com/s/1hqovkSO