目前我正在创建没有登录页面的网站。
我有另一个网站会发送一个包含信息的标题:
user:John
userCode:1234567
因此,我当前的网站将检查标头的内容,并在身份验证管理器中验证用户,如下所示:
首先我创建AuthenticationEntryPoint
所以unauthentication用户将去那里。在AuthenticationEntryPoint
我创建一个令牌并将用户重定向到主页面,所以在它进入主页面之前,spring会对用户进行身份验证并为有效用户提供令牌以使用该页面。代码是这样的:
@Component
public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint {
if(authException.getClass().getSimpleName().equals("InsufficientAuthenticationException")) {
if (request.getHeader("user") != null) {
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(request.getHeader("user"), request.getHeader("userCode"));
SecurityContextHolder.getContext().setAuthentication(auth);
response.sendRedirect(request.getContextPath());
}
}
}
在AuthenticationManager
中,如果用户有效,该过程将照常进行并给予令牌。我需要改变什么或者可以在春天使用的其他方法吗?
谢谢!
答案 0 :(得分:1)
您的案例让我想起参考文档中的Siteminder implementation example。 使用Siteminder,标头(SM_USER)与HTTP请求一起传递。
这是Spring Security中预身份验证的一个示例。
您是否尝试过此配置? 他们首先定义一个"自定义过滤器"这是 RequestHeaderAuthenticationFilter 的实例。
文件摘录:
<security:http>
<!-- Additional http configuration omitted -->
<security:custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter" />
</security:http>
<bean id="siteminderFilter" class="org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter">
<property name="principalRequestHeader" value="SM_USER"/>
<property name="authenticationManager" ref="authenticationManager" />
</bean>
<bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
<property name="preAuthenticatedUserDetailsService">
<bean id="userDetailsServiceWrapper"
class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
<property name="userDetailsService" ref="userDetailsService"/>
</bean>
</property>
</bean>
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider ref="preauthAuthProvider" />
</security:authentication-manager>