如何使用Shiro实现不同用户shiro 登录成功功后

TA的最新馆藏[转]&[转]&[转]&[转]&[转]&010Shiro配置文件中successUrl指定的页面只有一个: Java代码
&bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"&
&property name="securityManager" ref="securityManager"/&
&property name="loginUrl" value="/login"/&
&property name="successUrl" value="/main"/&
&property name="unauthorizedUrl" value="/login"/&
有的用户登录成功后要跳转到别的页面,怎么实现? 日 11:48 2 0 0 5添加评论4个答案按时间排序按投票排序00在success页面进行判断,不同的情况下重定向到不同页面 sendredirect日 14:11 93 0 0 7添加评论00登陆成功后获取 Subject 对象. 然后通过 Subject 对象来判断当前用户的角色/权限, 之后执行不同的跳转(直接在LoginAction中做). 我的登陆部分代码: Java代码
UsernamePasswordToken token = new UsernamePasswordToken(name, password);
SecurityUtils.getSubject().login(token);
Subject subject = SecurityUtils.getSubject();
// 这里可以调用subject 做判断
System.out.println("--------------------------------------------------------------");
Boolean isadmin = subject.hasRole("admin");
("是否为管理员:"+isadmin);
System.out.println("--------------------------------------------------------------");
String userId = (String)subject.getPrincipal();
User user = userService.getById(userId);
ShiroUser shiroUser = shiroUserService.getByDyId(userId);
if(shiroUser == null){
this.addActionError(getText("login.failure"));
return ERROR;
int used = shiroUser.getUsed();
if(used == 1){
this.addActionError(getText("login.noused"));
return ERROR;
Session session = subject.getSession(true);
session.setAttribute(LoginAction.USER_KEY, user);
session.setAttribute(LoginAction.SHIRO_USER_KEY, shiroUser);
("set workflow define to session");
session.setAttribute("ptDefine", WorkflowContext.getPtDefine());
} catch (AuthenticationException e) {
(e.getMessage());
this.addActionError(getText("login.failure"));
if (this.hasErrors()) {
("login erro ...");
return ERROR;
配置, 登陆跳转基本没用到, 注意 filterChainDefinitions, Java代码
&bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"&
&property name="securityManager" ref="securityManager"/&
&!-- override these for application-specific URLs if you like: --&
&property name="loginUrl" value="/index.jsp"/&
&property name="successUrl" value="/home.jsp"/&
&property name="unauthorizedUrl" value="/unauthorized.jsp"/&
&!-- 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 instance overrides or name aliases here if you like: --&
&property name="filters"&
&entry key="authc"&
&bean class="org.apache.shiro.web.filter.authc.PassThruAuthenticationFilter"/&
&/property&
&property name="filterChainDefinitions"&
# static file chains
/js/* = anon
/css/* = anon
/img/* = anon
/images/* = anon
/applets/* = anon
# login/logout chain
/login.action = anon
# some example chain definitions:
#/admin/** = authc, roles[ptAdmin]
/docs/** = authc, perms[document:read]
/** = user
# more URL-to-FilterChain definitions here
&/property&
日 15:19 99 0 1 14添加评论001.力推 Filter 过滤器, 2.后台判断根据权限跳转页面 日 12:38 2207 1 3 134添加评论00最简单的办法到success页面进行判断,然后不同的用户再重定向到不同的页面。日 12:19 7280 2 3 Shiro配置文件中successUrl指定的页面只有一个: Java代码
&bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"&
&property name="securityManager" ref="securityManager"/&
&property name="loginUrl" value="/login"/&
&property name="successUrl" value="/main"/&
&property name="unauthorizedUrl" value="/login"/&
有的用户登录成功后要跳转到别的页面,怎么实现? 日 11:48 2 0 0 5添加评论4个答案按时间排序按投票排序00在success页面进行判断,不同的情况下重定向到不同页面 sendredirect日 14:11 93 0 0 7添加评论00登陆成功后获取 Subject 对象. 然后通过 Subject 对象来判断当前用户的角色/权限, 之后执行不同的跳转(直接在LoginAction中做). 我的登陆部分代码: Java代码
UsernamePasswordToken token = new UsernamePasswordToken(name, password);
SecurityUtils.getSubject().login(token);
Subject subject = SecurityUtils.getSubject();
// 这里可以调用subject 做判断
System.out.println("--------------------------------------------------------------");
Boolean isadmin = subject.hasRole("admin");
("是否为管理员:"+isadmin);
System.out.println("--------------------------------------------------------------");
String userId = (String)subject.getPrincipal();
User user = userService.getById(userId);
ShiroUser shiroUser = shiroUserService.getByDyId(userId);
if(shiroUser == null){
this.addActionError(getText("login.failure"));
return ERROR;
int used = shiroUser.getUsed();
if(used == 1){
this.addActionError(getText("login.noused"));
return ERROR;
Session session = subject.getSession(true);
session.setAttribute(LoginAction.USER_KEY, user);
session.setAttribute(LoginAction.SHIRO_USER_KEY, shiroUser);
("set workflow define to session");
session.setAttribute("ptDefine", WorkflowContext.getPtDefine());
} catch (AuthenticationException e) {
(e.getMessage());
this.addActionError(getText("login.failure"));
if (this.hasErrors()) {
("login erro ...");
return ERROR;
配置, 登陆跳转基本没用到, 注意 filterChainDefinitions, Java代码
&bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"&
&property name="securityManager" ref="securityManager"/&
&!-- override these for application-specific URLs if you like: --&
&property name="loginUrl" value="/index.jsp"/&
&property name="successUrl" value="/home.jsp"/&
&property name="unauthorizedUrl" value="/unauthorized.jsp"/&
&!-- 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 instance overrides or name aliases here if you like: --&
&property name="filters"&
&entry key="authc"&
&bean class="org.apache.shiro.web.filter.authc.PassThruAuthenticationFilter"/&
&/property&
&property name="filterChainDefinitions"&
# static file chains
/js/* = anon
/css/* = anon
/img/* = anon
/images/* = anon
/applets/* = anon
# login/logout chain
/login.action = anon
# some example chain definitions:
#/admin/** = authc, roles[ptAdmin]
/docs/** = authc, perms[document:read]
/** = user
# more URL-to-FilterChain definitions here
&/property&
日 15:19 99 0 1 14添加评论001.力推 Filter 过滤器, 2.后台判断根据权限跳转页面 日 12:38 2207 1 3 134添加评论00最简单的办法到success页面进行判断,然后不同的用户再重定向到不同的页面。日 12:19 7280 2 3 591
如果您想留下此文,您可以将其发送至您的邮箱(将同时以邮件内容&PDF形式发送)
相关文章推荐
(Ctrl+Enter提交) &&
已有0人在此发表见解
&在& 02:30收藏到了
&&在信息爆炸的时代,您的知识需要整理,沉淀,积累!Lai18为您提供一个简单实用的文章整理收藏工具,在这里您可以收藏对您有用的技术文章,自由分门别类,在整理的过程中,用心梳理自己的知识!相信,用不了多久,您收藏整理的文章将是您一生的知识宝库!
· 蜀ICP备号-1shiro实现单点登录(一个用户同一时刻只能在一个地方登录)
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了shiro实现单点登录(一个用户同一时刻只能在一个地方登录)的相关资料,非常不错,具有参考借鉴价值,感兴趣的朋友一起学习吧
我这里 shiro 并没有集成 springMVC,直接使用 ini 配置文件。
# Objects and their properties are defined here,
# Such as the securityManager, Realms and anything
# else needed to build the SecurityManager
authc.loginUrl = /login.jsp
authc.successUrl = /web/index.jsp
#cache manager
builtInCacheManager = org.apache.shiro.cache.MemoryConstrainedCacheManager
securityManager=org.apache.shiro.web.mgt.DefaultWebSecurityManager
securityManager.cacheManager = $builtInCacheManager
securityManager.sessionManager=$sessionManager
#session 必须配置session,强制退出时,通过将session移除实现
sessionManager=org.apache.shiro.web.session.mgt.DefaultWebSessionManager
sessionManager.sessionDAO=$sessionDAO
sessionDAO=org.apache.shiro.session.mgt.eis.MemorySessionDAO
# Create ldap realm
ldapRealm = org.apache.shiro.realm.ldap.JndiLdapRealm
# Configure JDBC realm datasource
dataSource = org.postgresql.ds.PGPoolingDataSource
# Create JDBC realm.
jdbcRealm.permissionsLookupEnabled = true
jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.userRolesQuery = ......
jdbcRealm.permissionsQuery = ......
jdbcRealm.dataSource = $dataSource
#self realm
localAuthorizingRealm = com.redbudtek.shiro.LocalAuthorizingRealm
securityManager.realms = $ldapRealm, $localAuthorizingRealm
在 LocalAuthorizingRealm 中,用户登录进行认证之前,先将该用户的其他session移除:
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
String userName = (String)authenticationToken.getPrincipal();
//处理session
DefaultWebSecurityManager securityManager = (DefaultWebSecurityManager) SecurityUtils.getSecurityManager();
DefaultWebSessionManager sessionManager = (DefaultWebSessionManager)securityManager.getSessionManager();
Collection&Session& sessions = sessionManager.getSessionDAO().getActiveSessions();//获取当前已登录的用户session列表
for(Session session:sessions){
//清除该用户以前登录时保存的session
if(userName.equals(String.valueOf(session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY)))) {
sessionManager.getSessionDAO().delete(session);
String pwd =
return new SimpleAuthenticationInfo(userName,pwd,getName());
当session删除之后,必须有客户端与服务器端的交互,shiro才能进行认证判断。在与服务器交互时,subject信息截图如下:
此时的登录的用户认证已经失效,可以对客户端做出响应。
以上所述是小编给大家介绍的shiro实现单点登录(一个用户同一时刻只能在一个地方登录),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具5817人阅读
企业应用(11)
从cas server登录成功后,默认只能从casclient得到用户名。但程序中也可能遇到需要得到更多如姓名,手机号,email等更多用户信息的情况。
cas client拿到用户名后再到数据库中查询,的确可以得到关于该用户的更多信息。
但是如果用户登录成功后,直接从cas server返回给casclient用户的详细信息,这也是一个不错的做法。这个好处,尤其是在分布式中得以彰显,cas
server可以把用户信息传递给各个应用系统,如果是上面那种做法,那么各个系统得到用户名后,都得去数据库中查询一遍,无疑是一件重复性工作。
文章中 CAS 基础环境:
cas-server-3.5.2 & &
cas-client-3.2.1
&一、首先需要配置属性attributeRepository
首先,你需要到WEB-INF目录找到&deployerConfigContext.xml文件,同时配置attributeRepository
class=&org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao&id=&attributeRepository&&
&constructor-argindex=&0& ref=&casDataSource&/&
&constructor-argindex=&1& value=&select * from userinfo where {0}&/&
&propertyname=&queryAttributeMapping&&
&entrykey=&username& value=&loginname&/&
// 这里的key需写username和登录页面一致,value对应数据库用户名字段
&/property&
&propertyname=&resultAttributeMapping&&
// &!--key为对应的数据库字段名称,value为提供给客户端获取的属性名字,系统会自动填充值--&
&entrykey=&id& value=&id&/&
&entrykey=&mobile& value=&mobile&/&
&entrykey=&email& value=&email&/&
&/property&
切记:查询出来的字段名中间不能使用&_&(下划线),否则获取不到数据,如&cell_phone&需要&设置别名为&cellPhone.
queryAttributeMapping是组装sql用的查询条件属性,上述配置后,结合封装成查询sql就是&select *from userinfo where loginname=#username#
resultAttributeMapping是sql执行完毕后返回的结构属性,&key对应数据库字段,value对应客户端获取参数。
如果要组装多个查询条件,需要加上下面这个,默认为AND
&property name=&queryType&&
&value&OR&/value&
&& &&&&/property& &
二、配置用户认证凭据转化的解析器
也是在 deployerConfigContext.xml 中,找到credentialsToPrincipalResolvers,为UsernamePasswordCredentialsToPrincipalResolver 注入 attributeRepository,那么attributeRepository
就会被触发并通过此类进行解析,红色为新添部分。
&propertyname=&credentialsToPrincipalResolvers&&
&beanclass=&org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver&&
&property name=&attributeRepository&ref=&attributeRepository&/&
&beanclass=&org.jasig.cas.authentication.principal.HttpBasedServiceCredentialsToPrincipalResolver&/&
&/property&
&三、配置InMemoryServiceRegistryDaoImpl的属性&registeredServices
修改 deployerConfigContext.xml 中的 org.jasig.cas.services.InMemoryServiceRegistryDaoImpl的 属性 registeredServices。修改&registeredServices &的allowedAttributes属性值,将需要在客户端显示的列值加上。
id=&serviceRegistryDao& class=&org.jasig.cas.services.InMemoryServiceRegistryDaoImpl&&
&property name=&registeredServices&&
&beanclass=&org.jasig.cas.services.RegexRegisteredService&&
&property name=&id&value=&0& /&
&property name=&name&value=&HTTP and IMAP& /&
&property name=&description&value=&Allows HTTP(S) and IMAP(S) protocols& /&
&property name=&serviceId&value=&^(https?|imaps?)://.*& /&
&propertyname=&evaluationOrder& value=&& /&
&propertyname=&allowedAttributes&& // 客户端需要使用的对象的属性名称
&value&uid&/value&
&value&email&/value&
&value&mobile&/value&
&value&birth&/value&
&value&isMarry&/value&
&value&userno&/value&
&value&login_account&/value&
&/property&
【提示】网上说此bean中的ignoreAttributes属性默认是不添加用户信息,查看了 CAS 3.5.2版本的&AbstractRegisteredService&源码后,发现其默认值就是false,即:添加属性后,客户端就可见了
四、配置与客户端交互的xml信息
修改WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp。在server验证成功后,这个页面负责生成与客户端交互的xml信息,在默认的casServiceValidationSuccess.jsp中,只包括用户名,并不提供其他的属性信息,因此需要对页面进行扩展,如下,红色为新添加部分&
&cas:serviceResponsexmlns:cas='http://www.yale.edu/tp/cas'&
&cas:authenticationSuccess&
&cas:user&${fn:escapeXml(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.id)}&/cas:user&
&c:iftest=&${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes)& 0}&&
&cas:attributes&
&c:forEach var=&attr&items=&${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}&&
&cas:${fn:escapeXml(attr.key)}&${fn:escapeXml(attr.value)}&/cas:${fn:escapeXml(attr.key)}&
&/c:forEach&
&/cas:attributes&
&c:if test=&${not empty pgtIou}&&
&cas:proxyGrantingTicket&${pgtIou}&/cas:proxyGrantingTicket&
&c:iftest=&${fn:length(assertion.chainedAuthentications) & 1}&&
&cas:proxies&
&c:forEach var=&proxy&items=&${assertion.chainedAuthentications}&varStatus=&loopStatus& begin=&0&end=&${fn:length(assertion.chainedAuthentications)-2}&step=&1&&
&cas:proxy&${fn:escapeXml(proxy.principal.id)}&/cas:proxy&
&/c:forEach&
&/cas:proxies&
&/cas:authenticationSuccess&
&/cas:serviceResponse&
通过完成上面四个步骤的配置后,server端的工作就完成了,那么如何在客户端获取这些信息呢?下面进行说明:
客户端获取用户信息
cas client获取用户信息:
AttributePrincipal principal = (AttributePrincipal)request.getUserPrincipal();
Map attributes = principal.getAttributes();
String email=attributes .get(&email&);
和shiro集成后获取用户信息:
和shiro集成后,因为cas client将casFilter交给了shiroFilter,所以在通过shiro对象时可以用户信息的:
Subject subject = SecurityUtils.getSubject();
List list = subject.getPrincipals().asList();
String name = (String) list.get(0);
Map&String, Object& info = (Map&String, Object&)list.get(1);
String age = info.get(&age&).toString();
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:328233次
积分:6848
积分:6848
排名:第2715名
原创:123篇
评论:1312条
阅读:10486
阅读:19733
(4)(4)(4)(4)(5)(4)(4)(4)(4)(6)(3)(10)(5)(5)(9)(4)(6)(4)(4)(4)(3)(6)(3)(1)(5)(3)(4)(5)

我要回帖

更多关于 shiro实现单用户登录 的文章

 

随机推荐