集群版shiro(redis)搭建实录
??公司的公共服务-通知中心要增加登录验权功能,在考虑到以后的扩展性和集群部署的特性,选择了shiro+redis 的方案,现在就跟随我看看一个适用于集群的shiro是如何搭建的。
shiro配置
- 导包
- 修改web.xml
- 增加shiro-spring.xml 文件
shiro相关代码
- 自己设置Realm
- RedisCache实现
Start
配置
导入shiro相关jar包,这里使用maven来管理
image.png修改原有的web.xml文件,shiro接管Servlet过滤器
image.png3.工程使用的是spring,这里增加shiro-spirng.xml 完成shiro核心功能的配置和依赖。
- 在原有application.xml 文件中增加(文件名自己设置)
<import resource="/security-context.xml" />- 创立shiro-spring.xml 文件(我这里命名为security-context)
- 增加凭证匹配器(密码使用MD5加密验证,散列次数=1)
<!-- 凭证匹配器 密码MD5加密验证 --> <bean id="credentialsMatcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher"> <property name="hashAlgorithmName" value="md5"/> <property name="hashIterations" value="1"/> </bean>- 增加自己设置realm(安全数据源),并开启缓存和注入凭证匹配器
<!--自己设置Realm--> <bean id="noticeRealm" class="com.lingyun.security.relam.simpleRealm"> <!--启用缓存,默认关闭--> <property name="cachingEnabled" value="true"/> <!--启用身份验证缓存,即缓存AuthenticationInfo,默认false--> <property name="authenticationCachingEnabled" value="true"/> <!-- 配置密码匹配器 --> <property name="credentialsMatcher" ref="credentialsMatcher"/> </bean>- RedisCache相关类注册,这里使用了Git开源的shiro+redis缓存实现( alexxiyang/shiro-redis),做了本地化改造
<!--redis池管理器 --> <bean id="shardedJedisPoolManager" class="com.lingyun.security.rediscache.ShardedJedisPoolManager"> <property name="expire" value="1800"/><!-- 秒 --> </bean> <!--Session缓存DAO组件--> <bean id="redisSessionDAO" class="com.lingyun.security.rediscache.RedisSessionDAO"> <property name="redisManager" ref="shardedJedisPoolManager"/> </bean> <!--shiro(redis)缓存管理--> <bean id="redisCacheManager" class="com.lingyun.notice.service.web.security.rediscache.RedisCacheManager"> <property name="redisManager" ref="shardedJedisPoolManager"/> </bean>- 增加SimpleCookie,修改默认sessionID。默认sessionID 为JSESSIONID 会和容器名冲突, 如JETTY, TOMCAT 等,导致session失效
<!--修改默认sessionID 为notice-center--> <bean id="simpleCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> <constructor-arg name="name" value="notice-center"/> <property name="path" value="/"/> </bean>- 增加会话管理器,
<!-- (session)会话管理器 --> <bean id="sessionManager" class="com.lingyun.web.security.session.SimpleWebSessionManager"> <!--session缓存--> <property name="sessionDAO" ref="redisSessionDAO"/> <!--修改默认Cookie--> <property name="sessionIdCookie" ref="simpleCookie"/> <!-- session的失效时长,单位毫秒 --> <property name="globalSessionTimeout" value="600000"/> <!-- 删除失效的session --> <property name="deleteInvalidSessions" value="true"/> <!--隐藏url中的JSESSIONID --> <property name="sessionIdUrlRewritingEnabled" value="false"/> </bean>- 配置shiroWeb过滤器,实现url自己设置阻拦
<!-- Shiro 的Web过滤器 --> <bean id="securityFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager"/> <property name="loginUrl" value="/login.html"/> <property name="unauthorizedUrl" value="/login.html"/> <property name="filterChainDefinitions"> <value> /static/** = anon /doLogin = anon /error = anon /send* = anon /** = user </value> </property> </bean>- 开启rememberMe功能
<!-- rememberMeManager管理器,写cookie,取出cookie生成客户信息 --> <bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager"> <property name="cookie" ref="rememberMeCookie"/> </bean> <!-- 记住我cookie --> <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> <!-- rememberMe是cookie的名字 --> <constructor-arg value="notice-cookie"/> <!-- 记住我cookie生效时间30天 --> <property name="maxAge" value="2592000"/> </bean>- 最后注册安全管理器,注入相关管理器
<!-- securityManager安全管理器 --> <bean id="securityManager" class="com.lingyun.security.SimpleWebSecurityManager"> <property name="realm" ref="noticeRealm"/> <!-- 注入缓存管理器 --> <property name="cacheManager" ref="redisCacheManager"/> <!-- 注入session管理器 --> <property name="sessionManager" ref="sessionManager"/> <!-- 记住我 --> <property name="rememberMeManager" ref="rememberMeManager"/> </bean>??到这里shiro相关的配置及改造就结束了,接下来是少量和业务绑定的代码和数据库相关
continue
代码编写及改造
创立客户DTO和Table,这里要注意UserDTO肯定要实现序列化接口,redis缓存时会序列化对象
image.png2.自己设置Realm实现,要注意由于使用了凭证匹配器,认证时不用再做密码验证,将数据源中的密码传入就可,另外因实现了redis缓存,要传入UserDTO实例
/** * 认证 * * @param token * @return * @throws AuthenticationException */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { String username = (String) token.getPrincipal(); NoticeUserDTO user = noticeUserInfoService.findUserIFByName(username); if (user == null || user.getDataState() == 0) { throw new UnknownAccountException(); //客户为空 } //假如身份认证验证成功,返回一个AuthenticationInfo实现; return new SimpleAuthenticationInfo(user, user.getPassword(), getName()); }??这样一个简版的shiro框架就搭建起来了,至于权限验证和其余功能,在以后的工作再慢慢增加。
终
说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 集群版shiro(redis)搭建实录
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 集群版shiro(redis)搭建实录