shiro多realm配置(可区分不同类型用户)
2017-06-05 22:54
141 查看
由于项目中需要用到shiro,但是用户来自不同的三张表,需要根据token判断不同类型的用户,但是shiro得token不支持带类型的参数,所以需要重写token及认证器
1.自定义token
2.自定义认证器
3.配置shiro xml文件
<!-- 配置 Shiro 的 SecurityManager 实例 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="authenticator" ref="pointRealmAuthenticator" />
<!-- 单Realm配置废弃 -->
<!-- <property name="realm" ref="shiroDbRealm" /> -->
<!-- 多Realm注入 -->
<property name="realms">
<list>
<ref bean="pointSysShiroDbRealm" />
<ref bean="pointExchangeShiroDbRealm" />
<ref bean="pointValidShiroDbRealm" />
</list>
</property>
<property name="cacheManager" ref="shiroEhcacheManager" />
</bean>
<!-- 项目自定义Authenticator -->
<bean id="pointRealmAuthenticator"
class="org.zmshop.common.shiro.authenticator.PointRealmAuthenticator">
<!-- realmMap -->
<property name="definedRealms">
<map>
<entry key="pointSysShiroDbRealm" value-ref="pointSysShiroDbRealm" />
<entry key="pointExchangeShiroDbRealm" value-ref="pointExchangeShiroDbRealm" />
<entry key="pointValidShiroDbRealm" value-ref="pointValidShiroDbRealm" />
</map>
</property>
</bean>
<!-- 项目自定义的Realm -->
<!-- 积分后台用户(后台管理员)Realm -->
<bean id="pointSysShiroDbRealm" class="org.zmshop.common.shiro.realm.PointSysShiroDbRealm">
<property name="maUserService" ref="maUserServiceImpl" />
<property name="baUserGradeService" ref="baUserGradeServiceImpl" />
</bean>
<!-- 积分兑换端用户(店长店员)Realm -->
<bean id="pointExchangeShiroDbRealm" class="org.zmshop.common.shiro.realm.PointExchangeShiroDbRealm">
<property name="baUserService" ref="baUserServiceImpl" />
<property name="baUserSubService" ref="baUserSubServiceImpl" />
<property name="stClerkService" ref="stClerkServiceImpl" />
<property name="baUserGradeService" ref="baUserGradeServiceImpl" />
<property name="stMainService" ref="stMainServiceImpl" />
</bean>
<!-- 积分验证端用户(第三方合作店铺)Realm -->
<bean id="pointValidShiroDbRealm" class="org.zmshop.common.shiro.realm.PointValidShiroDbRealm">
<property name="ebtPointEmployeeService" ref="ebtPointEmployeeServiceImpl" />
<property name="baUserGradeService" ref="baUserGradeServiceImpl" />
</bean>
4.Realm文件需注意事项
1.自定义token
/** * 自定义带用户类型token * @author Sunny */ public class UsernamePasswordByUserTypeToken extends UsernamePasswordToken { private static final long serialVersionUID = -7638434498222500528L; /* * 用户类型 * 1:积分后台用户(后台管理员) * 2:积分兑换端用户(店长店员) * 3:积分验证端用户(第三方合作店铺) */ private String userType; public String getUserType() { return userType; } public void setUserType(String userType) { this.userType = userType; } public UsernamePasswordByUserTypeToken(String username, String password, String userType) { super(username, password); this.userType = userType; } }
2.自定义认证器
/** * 自定义认证器 * * @author Sunny */ public class PointRealmAuthenticator extends ModularRealmAuthenticator { /** * 存放realm */ private Map<String, Object> definedRealms; public void setDefinedRealms(Map<String, Object> definedRealms) { this.definedRealms = definedRealms; } /** * 根据用户类型判断使用哪个Realm */ @Override protected AuthenticationInfo doAuthenticate(AuthenticationToken authenticationToken) throws AuthenticationException { super.assertRealmsConfigured(); Realm realm = null; // 使用自定义Token UsernamePasswordByUserTypeToken token = (UsernamePasswordByUserTypeToken) authenticationToken; // 判断用户类型 if ("1".equals(token.getUserType())) { realm = (Realm) this.definedRealms.get("pointSysShiroDbRealm"); } else if ("2".equals(token.getUserType())) { realm = (Realm) this.definedRealms.get("pointExchangeShiroDbRealm"); } else if ("3".equals(token.getUserType())) { realm = (Realm) this.definedRealms.get("pointValidShiroDbRealm"); } return this.doSingleRealmAuthentication(realm, authenticationToken); } }
3.配置shiro xml文件
<!-- 配置 Shiro 的 SecurityManager 实例 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="authenticator" ref="pointRealmAuthenticator" />
<!-- 单Realm配置废弃 -->
<!-- <property name="realm" ref="shiroDbRealm" /> -->
<!-- 多Realm注入 -->
<property name="realms">
<list>
<ref bean="pointSysShiroDbRealm" />
<ref bean="pointExchangeShiroDbRealm" />
<ref bean="pointValidShiroDbRealm" />
</list>
</property>
<property name="cacheManager" ref="shiroEhcacheManager" />
</bean>
<!-- 项目自定义Authenticator -->
<bean id="pointRealmAuthenticator"
class="org.zmshop.common.shiro.authenticator.PointRealmAuthenticator">
<!-- realmMap -->
<property name="definedRealms">
<map>
<entry key="pointSysShiroDbRealm" value-ref="pointSysShiroDbRealm" />
<entry key="pointExchangeShiroDbRealm" value-ref="pointExchangeShiroDbRealm" />
<entry key="pointValidShiroDbRealm" value-ref="pointValidShiroDbRealm" />
</map>
</property>
</bean>
<!-- 项目自定义的Realm -->
<!-- 积分后台用户(后台管理员)Realm -->
<bean id="pointSysShiroDbRealm" class="org.zmshop.common.shiro.realm.PointSysShiroDbRealm">
<property name="maUserService" ref="maUserServiceImpl" />
<property name="baUserGradeService" ref="baUserGradeServiceImpl" />
</bean>
<!-- 积分兑换端用户(店长店员)Realm -->
<bean id="pointExchangeShiroDbRealm" class="org.zmshop.common.shiro.realm.PointExchangeShiroDbRealm">
<property name="baUserService" ref="baUserServiceImpl" />
<property name="baUserSubService" ref="baUserSubServiceImpl" />
<property name="stClerkService" ref="stClerkServiceImpl" />
<property name="baUserGradeService" ref="baUserGradeServiceImpl" />
<property name="stMainService" ref="stMainServiceImpl" />
</bean>
<!-- 积分验证端用户(第三方合作店铺)Realm -->
<bean id="pointValidShiroDbRealm" class="org.zmshop.common.shiro.realm.PointValidShiroDbRealm">
<property name="ebtPointEmployeeService" ref="ebtPointEmployeeServiceImpl" />
<property name="baUserGradeService" ref="baUserGradeServiceImpl" />
</bean>
4.Realm文件需注意事项
public class PointExchangeShiroDbRealm extends AuthorizingRealm { /** * 身份验证回调函数,登录时调用 */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException { //具体登录判断逻辑 return xxx; } /** * 授权查询回调函数,进行鉴权但缓存中无用户的授权信息时调用 * 多realm该方法会在多个realm之间调用,所以需要判断当前用户是否是当前类中的shirouser对象[其他realm一样] */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { // 判断是否是当前用户登录的对象 if (principals == null || !(principals.getPrimaryPrincipal() instanceof ShiroUser)) { return null; } return xxx; } /** * 自定义Authentication对象,使得Subject除了携带用户的登录名外还可以携带更多信息. */ public class ShiroUser implements Serializable { private static final long serialVersionUID = 7240137316895366700L; } }
相关文章推荐
- 从源代码剖析Struts2中用户自定义配置转换器的两种方式——基于字段的配置转换器和基于类型的配置转换器(解决了实际系统中,因没有区分这两种工作方式的生命周期而引起的异常错误问题)
- 返回值类型的不同不能作为区分重载的途径
- 为用户的配置文件路径(原来在“Documents and Settings”文件夹的子目录)指定一个不同的文件夹
- git在linux上的安装配置包括设置不同用户的权限
- xml读取、保存不同类型打印配置的代码[原创]
- 用户配置文件的类型
- xml读取、保存不同类型打印配置的代码[原创]
- git在linux上的安装配置包括设置不同用户的权限
- C#只能靠参数而不能靠返回值类型的不同来区分方法重载
- apache不同类型虚拟主机配置
- linux下的ftp配置多个用户对应不同的目录的工作笔记2013052402
- 为匿名用户实现简单的数据类型配置
- H3C S3600 交换机 VLAN中不同类型端口的配置
- .net 访问不同数据库之配置参数和参数数据类型
- 【32位和64位不同的操作系统】环境的配置,如何区分JDK,Tomcat,eclipse的32位与64版本
- asp如何区分同一局域网的不同用户的方法
- 小宗的启示:不同类型的liferay用户登录到不同页面(登录跳转个性化)——liferay5.0.1用户登录后的跳转(二)
- C#只能靠参数而不能靠返回值类型的不同来区分方法重载
- #舍得Share#php开发笔记-通过IP区分不同国家的用户
- vsftp 多用户不同访问权限配置