我对Spring和Spring安全性比较陌生。
我试图编写一个程序,我需要在服务器端使用Spring安全性对用户进行身份验证,
我得出了以下结论:
public class CustomAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider{
@Override
protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken)
throws AuthenticationException
{
System.out.println("Method invoked : additionalAuthenticationChecks isAuthenticated ? :"+usernamePasswordAuthenticationToken.isAuthenticated());
}
@Override
protected UserDetails retrieveUser(String username,UsernamePasswordAuthenticationToken authentication) throws AuthenticationException
{
System.out.println("Method invoked : retrieveUser");
//so far so good, i can authenticate user here, and throw exception if not authenticated!!
//THIS IS WHERE I WANT TO ACCESS SESSION OBJECT
}
}
字符串
我的用例是,当一个用户被认证时,我需要放置一个属性,如:
session.setAttribute("userObject", myUserObject);
型
myUserObject是某个类的对象,我可以通过多个用户请求在整个服务器代码中访问它。
9条答案
按热度按时间zf9nrax11#
你的朋友是
org.springframework.web.context.request.RequestContextHolder
字符串
这将由标准的spring mvc dispatch servlet填充,但是如果你使用不同的web框架,你必须在
web.xml
中添加org.springframework.web.filter.RequestContextFilter
作为过滤器来管理保持器。编辑:作为一个附带的问题,你实际上想做什么,我不确定你是否需要在
UserDetailsService
的retieveUser
方法中访问HttpSession
。Spring security将为你在会话中放置UserDetails对象。它可以通过访问SecurityContextHolder
来检索:型
nzkunb0c2#
既然你使用的是Spring,那就坚持使用Spring,不要像其他帖子所说的那样自己动手。
Spring manual说道:
出于安全考虑,您不应该直接与HttpSession交互。这样做根本没有正当理由-始终使用SecurityContextHolder。
访问会话的建议最佳做法是:
字符串
这里的关键是Spring和Spring Security为您做了各种各样的伟大的事情,比如Session Fixation Prevention。这些事情假设您正在使用Spring框架,因为它被设计用于使用。因此,在您的servlet中,使其具有上下文意识并像上面的示例那样访问会话。
如果你只需要在会话作用域中存储一些数据,试着创建一些会话作用域bean,比如this example,让autowire来发挥它的魔力。
q8l4jmvw3#
我自己做的utils.它很方便。:)
字符串
sbtkgmzw4#
实际上,即使会话在HttpSessionLisener上被销毁,您也可以通过执行以下操作从会话中访问信息:
字符串
或者你也可以在任何有HttpSession对象的地方访问信息,比如:
型
最后一个假设你有这样的东西:
型
1u4esq0p5#
在我的场景中,我像这样将HttpSession注入到CustomAuthenticationProvider类中
字符串
91zkwejq6#
我尝试与下一个代码和工作出色
字符串
g9icjywg7#
如果你需要的只是User的详细信息,对于 Spring Version 4.x,你可以使用Spring提供的
@AuthenticationPrincipal
和@EnableWebSecurity
标签,如下所示。安全配置类:
字符串
控制器方法:
型
jljoyd4f8#
字符串
vptzau2j9#
字符串