控制用户重复登陆
springsecurity有控制单账号只能在一个地方登陆的功能,后登陆用户将踢掉前登陆用户;或者限制账号重复登陆,一个账号没有退出,另外一个人想用这个账号就登陆不上。
现在我想根据原有的这些功能参考,做一个管理员可以将某正在session中的用户踢出系统的功能。便于管理员修改了登陆用户的权限或者部门设置后,强制让该用户重新登录。
主要参考了如下两篇文章:
http://www.family168.com/oa/springsecurity/html/ch214-smart-concurrent.html
http://www.blogjava.net/beyondwcm/archive/2009/05/08/269545.html
主要涉及的类如下(我自己的山寨理解):
HttpSessionEventPublisher 监听session创建和销毁
ConcurrentSessionFilter 每次有http请求时校验,看你当前的session是否是过期的
SessionRegistryImpl 存放session中的信息,并做处理
ConcurrentSessionControllerImpl 用户登入登出的控制
SessionInformation 存储session中信息的model
先实现springsecurity文档上的,限制用户重复登陆,后登陆用户将前登陆用户冲掉 ,只需要在xml中配置如下:
<authentication-manager alias="authenticationManager"
session-controller-ref="currentController" />
<beans:bean id="concurrentSessionFilter" class="org.springframework.security.concurrent.ConcurrentSessionFilter">
<custom-filter position="CONCURRENT_SESSION_FILTER" />
<beans:property name="sessionRegistry" ref="sessionRegistry" />
<!-- 踢出的用户转向的页面-->
<beans:property name="expiredUrl" value="/user/user.action" />
<beans:property name="logoutHandlers">
<beans:list>
<beans:bean class="org.springframework.security.ui.logout.SecurityContextLogoutHandler" />
<beans:bean
class="org.springframework.security.ui.rememberme.TokenBasedRememberMeServices">
<beans:property name="key" value="e37f4b31-0c45-11dd-bd0b-0800200c9a66"/>
<beans:property name="userDetailsService" ref="userDetailsService"/>
</beans:bean>
</beans:list>
</beans:property>
</beans:bean>
<beans:bean id="sessionRegistry" class="org.springframework.security.concurrent.SessionRegistryImpl" />
<beans:bean id="currentController"
class="org.springframework.security.concurrent.ConcurrentSessionControllerImpl">
<beans:property name="sessionRegistry" ref="sessionRegistry" />
<!-- true限制不允许第二个用户登录,false第二个登陆用户踢掉前一个登陆用户 -->
<beans:property name="exceptionIfMaximumExceeded" value="false" />
<!-- 等第二种情况是,允许同时多少个用户同时登陆 -->
<beans:property name="maximumSessions" value="2"/>
</beans:bean>
其中web.xml还需要添加:
<!-- 登入和登出时对SessionRegistryImpl进行处理 -->
<listener>
<listener-class>org.springframework.security.ui.session.HttpSessionEventPublisher</listener-class>
</listener>
提供管理员调用踢出用户
配置文件基本上和(一)比没有做什么修改,只是不限制用户用同一账号登陆,所以配置maximumSessions为-1
<beans:bean id="currentController"
class="org.springframework.security.concurrent.ConcurrentSessionControllerImpl">
<beans:property name="sessionRegistry" ref="sessionRegistry" />
<beans:property name="exceptionIfMaximumExceeded"
value="false" />
<beans:property name="maximumSessions" value="-1"/>
</beans:bean>
其实要实现列表当前登陆的用户,并踢出用户,就是调用springsecurity的
org.springframework.security.concurrent.SessionRegistryImpl
就可以满足要求了,当然,用这个类来做踢出用户的功能,不是很好,不过也懒得去动这个源码了,由于mini-web的示例是struts2的,所以我就简单的写了个Action去调用这个类来操作,如果要用到公司的项目中,那还要放到controller里面去才行,SessionAction.java:
package org.springside.examples.miniweb.web.user;
import java.util.ArrayList;
import java.util.List;
import org.apache.struts2.config.ParentPackage;
import org.apache.struts2.config.Result;
import org.apache.struts2.config.Results;
import org.apache.struts2.dispatcher.ServletActionRedirectResult;
import org.springframework.security.concurrent.SessionInformation;
import org.springframework.security.concurrent.SessionRegistry;
import org.springside.modules.web.struts2.CRUDActionSupport;
import org.springside.modules.web.struts2.SimpleActionSupport;
@ParentPackage("default")
@Results( { @Result(name = CRUDActionSupport.RELOAD, value = "/session", type = ServletActionRedirectResult.class) })
public class SessionAction extends SimpleActionSupport {
private static final String RELOAD = "reload";
private static final long serialVersionUID = 8071034786218297672L;
private String loginId;
private SessionRegistry sessionRegistry;
List<String> loginIds;
//默认方法
public String execute() throws Exception {
return list();
}
//列表当前登录的用户的loginIds
public String list() throws Exception {
Object[] loginIds_obj = sessionRegistry.getAllPrincipals();
if (loginIds_obj != null && loginIds_obj.length > 0) {
loginIds = new ArrayList<String>(loginIds_obj.length);
for (int i = 0; i < loginIds_obj.length; i++) {
loginIds.add((String) loginIds_obj[i]);
}
}
return SUCCESS;
}
//根据传入的loginId,踢出某用户
public String destroy() throws Exception {
SessionInformation[] sessions_arrs = sessionRegistry.getAllSessions(
loginId, false);
if (sessions_arrs != null && sessions_arrs.length > 0) {
for (int i = 0; i < sessions_arrs.length; i++) {
sessions_arrs[i].expireNow();
// sessionRegistry.removeSessionInformation(sessions_arrs[i].getSessionId());
}
}
return RELOAD;
}
public String getLoginId() {
return loginId;
}
public void setLoginId(String loginId) {
this.loginId = loginId;
}
public List<String> getLoginIds() {
return loginIds;
}
public void setLoginIds(List<String> loginIds) {
this.loginIds = loginIds;
}
public void setSessionRegistry(SessionRegistry sessionRegistry) {
this.sessionRegistry = sessionRegistry;
}
}
分享到:
相关推荐
- **springsecurity-sample**:这个示例项目可能包含了从创建用户、角色到实现登录、权限控制的完整流程。你可以通过它学习如何配置Spring Security XML或Java配置,如何编写自定义的认证和授权逻辑,以及如何在...
它不仅能够处理身份验证(authentication)和授权(authorization),还提供了对加密、CSRF保护、会话管理等功能的支持。在实际项目中,开发者常常需要根据具体需求自定义数据库表结构,以存储认证和授权信息,这...
6. **SpringSecurity扩展** - OAuth2:SpringSecurity支持OAuth2协议,实现第三方登录和API保护。 - JWT(JSON Web Tokens):可使用JWT进行状态less的认证,提高系统的可扩展性。 - CORS(Cross-Origin Resource...
4. **会话管理**:Spring Security提供了会话管理功能,如会话固定保护、会话超时和并发会话控制。这在防止会话劫持和会话固定攻击方面至关重要。 5. **CSRF(跨站请求伪造)防护**:Spring Security 3.1默认提供了...
4. **会话管理(Session Management)**:Spring Security提供了强大的会话管理功能,可以限制同一用户同时在线的数量,检测会话劫持和会话固定攻击,并能实现会话超时策略。 5. **CSRF保护(Cross-Site Request ...
4. **处理登录和会话管理**:创建一个登录接口,用户可以通过这个接口提交凭证并获取JWT token。这个token将在后续的请求中携带,以证明用户的身份。同时,需要处理session管理和token的刷新,确保用户会话的安全性...
随着Spring Security 2.x的发布,它提供了一种更为简洁且高效的方式来进行Web应用的安全管理。快速启动Spring Security 2.x,主要分为三个步骤: 1. **添加过滤器**: 在`web.xml`中加入`DelegatingFilterProxy`,...
- **会话管理**: - **检测超时**:可以配置会话超时时间。 - **同步会话控制**:控制并发会话的数量。 - **防止 Session 固定攻击**:通过改变会话 ID 来提高安全性。 - **对 OpenID 的支持**:支持 OpenID 身份...
Spring Security 是一款基于 Spring 框架的安全插件,提供了完整的安全性解决方案,包括身份认证(Authentication)、授权(Authorization)以及会话管理(Session Management)等功能。Spring Security 的设计目标是为...
4. **会话管理(Session Management)**:Spring Security 提供了会话管理和会话固定防护功能。在demos中,你可以了解如何配置会话超时、跨站点请求伪造(CSRF)防护,以及如何防止会话固定攻击。 5. **异常处理...
9. **自定义扩展**:SpringSecurity的设计允许开发者根据需求定制安全行为,如自定义认证、授权策略,以及创建新的安全过滤器。 在学习SpringSecurity源码时,建议从以下几个方面入手: 1. **源码结构分析**:了解...
此外,SpringSecurity还提供了会话管理功能,包括会话固定保护(Session Fixation Protection)和会话超时(Session Timeout)等,以防止会话劫持和会话固定攻击。它还集成了Remember Me服务,允许用户在一定时间内...
6. **会话管理(Session Management)**:Spring Security 提供了会话管理功能,包括会话固定保护、会话超时和并发会话控制,防止会话劫持和会话固定攻击。 7. **CSRF(跨站请求伪造)防护**:Spring Security 自动...
4. **会话管理**:Spring Security提供了会话管理功能,可以防止会话固定攻击(Session Fixation),并能控制单个用户的最大并发会话数量。 5. **CSRF保护**:Spring Security默认开启CSRF防护,通过生成并验证CSRF...
而"springsecurity-sample.rar"则可能是包含示例代码的压缩包,帮助开发者通过实际操作理解Spring Security的用法。 通过学习Spring Security,开发者可以构建出更安全、更健壮的Java应用。无论是在企业级应用还是...
它提供了全面的安全解决方案,包括用户认证、权限授权、会话管理、CSRF防护以及基于HTTP的访问控制。在这个例子中,我们将深入探讨如何使用Spring Security进行认证和授权,并结合数据库操作进行动态配置。 首先,...
它为基于Spring的应用程序提供了全面的安全服务,包括用户认证、角色权限管理、会话管理以及CSRF(跨站请求伪造)防护。这个"SpringSecurity安全框架基础Demo"旨在帮助开发者快速理解和实践Spring Security的核心...
Spring Security允许开发者通过自定义Filter、Provider、AuthenticationManager等来扩展其功能。例如,可以创建自定义的AuthenticationProvider来实现特定的认证逻辑,或者创建自定义的AccessDecisionVoter来执行...
8. **自定义扩展**:Spring Security 的设计是模块化的,允许开发者根据需求添加或替换组件,如认证提供者、授权策略、加密机制等,以适应各种复杂的安全场景。 9. **安全性配置**:配置Spring Security 主要通过...
SpringSecurity还提供了丰富的扩展点,如自定义权限表达式、访问决策管理器、过滤器链等,可以根据实际需求进行定制。此外,SpringBoot结合SpringSecurity可以轻松地与Spring Data JPA集成,实现基于数据库的角色和...