mch*_*bok 5 session spring spring-security
我想获得当前登录我的应用程序的所有用户的列表.我知道,我应该SessionRegistry在我的代码中注入调用getAllPrincipals()方法.不幸的是,我总是得到空名单.它似乎SessionRegistry不是填充,我不知道如何制作它.我知道,在StackOverflow上有类似的问题,但我仍然有解决问题的问题.首先,我将此代码添加到我的web.xml中:
<listener>
<listener-class>
org.springframework.security.web.session.HttpSessionEventPublisher
</listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)
据我所知,它允许获取有关会话的生命周期(创建,销毁)的信息.就这样.我向前迈进了很大的问题.我的安全bean文件如下:
<beans:bean id="successAuth" class="pl.fp.microblog.auth.SuccessAuth"/>
<beans:bean id="failureAuth" class="pl.fp.microblog.auth.FailureAuth"/>
<http auto-config="true">
<intercept-url pattern="/" access="ROLE_USER" />
<intercept-url pattern="/profile/*" access="ROLE_USER" />
<form-login
login-page="/login"
authentication-success-handler-ref="successAuth"
authentication-failure-handler-ref="failureAuth"
username-parameter="username"
password-parameter="password"
login-processing-url="/login_processing_url"
/>
<security:logout logout-url="/logout_processing_url"/>
<session-management>
<concurrency-control max-sessions="1" session-registry-alias="sessionRegistry"/>
</session-management>
</http>
<beans:bean id="saltProvider" class="org.springframework.security.authentication.dao.ReflectionSaltSource">
<beans:property name="userPropertyToUse" value="username"></beans:property>
</beans:bean>
<beans:bean id="userService" class="pl.fp.microblog.auth.UserService">
<beans:property name="userDAO" ref="userDAO"/>
</beans:bean>
<authentication-manager>
<security:authentication-provider user-service-ref="userService">
<password-encoder hash="sha-256">
<security:salt-source ref="saltProvider"/>
</password-encoder>
</security:authentication-provider>
</authentication-manager>
Run Code Online (Sandbox Code Playgroud)
在这里我调用getAllPrinciples()方法:
@Transactional
@Controller
public class SiteController {
@Autowired
private UserDAO userDAO;
@Autowired
private SessionRegistry sessionRegistry;
@RequestMapping(value = "profile/{login}")
public String profilePage(@PathVariable String login, HttpServletRequest req) throws SQLException {
...
sessionRegistry.getAllPrincipals().size()
...
return "profile";
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试添加session-managemenent代码到我的http,ConcurrentSessionFilter和类似的事情,但其实我不明白.文档对我来说太复杂了.有没有人可以帮助我,一步一步说出下一步该做什么?我应该添加哪些豆类?
我想你差不多了.你唯一可能错过的是使用session-registry-alias.通过在concurrency-control元素上使用该属性,您可以公开会话注册表,以便可以将其注入您自己的bean.请参阅参考文档.
所以你需要的是:
<http auto-config="true">
...
<session-management>
<concurrency-control max-sessions="1" session-registry-alias="sessionRegistry"/>
</session-management>
</http>
Run Code Online (Sandbox Code Playgroud)
现在您有一个对会话注册表的引用,该注册表将由ConcurrentSessionControlStrategy上面的配置隐式设置.要使用它,您只需将其注入您的bean:
<bean class="YourOwnSessionRegistryAwareBean">
<property sessionRegistry="sessionRegistry"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
请注意,上述配置还将限制用户可能拥有的并发会话数.如果您不想要此限制,则必须放弃命名空间配置的便利性,因为命名空间架构不允许您将max-sessions属性设置为-1.如果您需要有关如何手动连接必要bean的帮助,参考文档会提供详细说明.
| 归档时间: |
|
| 查看次数: |
10585 次 |
| 最近记录: |