RKo*_*dla 22 java spring spring-mvc spring-security
我们使用RequestHeaderAuthenticationFilteras实现预身份验证策略和PreAuthenticatedAuthenticationProvider身份验证提供程序.其中一个要求是使用以下信息将所有成功登录存储到数据库.由于用户IP地址和其他请求相关信息在UserDetailsService课堂上不可用,检索此信息并在db中存储的最佳策略是什么?
Tom*_*icz 36
所有信息都可以通过HttpServletRequest.您可以通过以下方式获取:
最简单的方法是将servlet请求直接注入到您的UserDetailsService:类中:
public MyDetailsService implements UserDetailsService {
@Autowired
private HttpServletRequest request;
//...
}
Run Code Online (Sandbox Code Playgroud)
(根据OP的建议)请记住将以下监听器添加到您的web.xml:
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
Run Code Online (Sandbox Code Playgroud)
更新:这是有效的,因为Spring注入了特殊的作用域代理实现HttpServletRequest,因此您可以从singleton-scoped访问请求范围的请求"bean" MyDetailsService.在引擎盖下,每次调用request的参数都会被路由到org.springframework.web.context.request.RequestContextHolder#requestAttributesHolder ThreadLocal您也可以直接访问.正如您所看到的,Spring在确定范围规则时非常灵活.它只是有效.
RequestContextHolder另一种方法是使用RequestContextHolder:
HttpServletRequest request =
((ServletRequestAttributes) RequestContextHolder.
currentRequestAttributes()).
getRequest();
Run Code Online (Sandbox Code Playgroud)
这可能是一个很好的方法:
1)创建一个扩展SavedRequestAwareAuthenticationSuccessHandler的类
public class MyCustomSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws ServletException, IOException {
Run Code Online (Sandbox Code Playgroud)
2)将"成功处理程序"分配给安全过滤器:
<beans:bean id="myFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
<beans:property name="authenticationManager" ref="authenticationManager"/>
<beans:property name="authenticationFailureHandler" ref="failureHandler" />
<beans:property name="authenticationSuccessHandler" ref="successHandler" />
</beans:bean>
<beans:bean id="successHandler" class="yourPackage.MyCustomSuccessHandler" >
<beans:property name="defaultTargetUrl" value="/index.html" />
<beans:property name="alwaysUseDefaultTargetUrl" value="true"/>
</beans:bean>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19582 次 |
| 最近记录: |