gpt4 book ai didi

spring - 使用 Spring Security 集成单点登录

转载 作者:IT老高 更新时间:2023-10-28 13:53:04 25 4
gpt4 key购买 nike

我正在使用 Spring Security,我想使用另一个站点作为我的身份验证提供程序之一。我在我的网站上有一个基于基本表单的登录。我想在我的网站上有一个链接,将用户带到他们将登录的外部网站,然后该外部网站将向我发布一个 xml 响应,其中包含我可以验证的数据以查看是否成功登录。任何帮助将不胜感激!

  1. 如何将该流程集成到 Spring Security 中?
  2. 收到回复后,如何自动登录用户?

使用以下指南的示例:

过滤器(未显示我的数据来自请求的 xml):

public class XMLAuthenticationFilter extends AbstractAuthenticationProcessingFilter{

public XMLAuthenticationFilter() {
super("/xml_security_check");
}

@Override
public Authentication attemptAuthentication(HttpServletRequest request,
HttpServletResponse response) throws AuthenticationException,
IOException, ServletException {

GrantedAuthority[] grantedAuthorities = new GrantedAuthority[] { new GrantedAuthorityImpl("ROLE_USER")};
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken("userid", "pwd", grantedAuthorities);
request.getSession();
token.setDetails(new WebAuthenticationDetails(request));
Authentication authenticatedUser = super.getAuthenticationManager().authenticate(token);
SecurityContextHolder.getContext().setAuthentication(authenticatedUser);
request.getSession().setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, SecurityContextHolder.getContext());
return authenticatedUser;

}

}

身份验证提供者:

public class XMLAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider{
private UserManager userManager;
@Override
protected void additionalAuthenticationChecks(UserDetails user, UsernamePasswordAuthenticationToken token) throws AuthenticationException {

}

@Override
protected UserDetails retrieveUser(String userName, UsernamePasswordAuthenticationToken token) throws AuthenticationException {
UserDetails user = userManager.getUser(userName);
if(user == null){
Users newDCUser = new Users();
newDCUser.setUserId(userName);
newDCUser.setRawPassword((String) token.getCredentials());
newDCUser.setFailedLoginAttempts(0);
newDCUser.setBeginEffectiveDate(new Date());
newDCUser.setEndEffectiveDate(getEffectiveDate());
userManager.saveUser(newDCUser);
}
return userManager.loadUserByUsername(userName);
}

private Date getEffectiveDate(){
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.YEAR, 10);
return calendar.getTime();
}

public UserManager getUserManager() {
return userManager;
}

public void setUserManager(UserManager userManager) {
this.userManager = userManager;
}
}

bean 配置:

<bean id="xmlAuthenticationFilter" class="com.dc.api.service.impl.XMLAuthenticationFilter">
<property name="authenticationManager" ref="am" />
</bean>
<bean id="xmlAuthenticationProvider" class="com.dc.api.service.impl.XMLAuthenticationProvider">
<property name="userManager" ref="userManager"/>
</bean>

最佳答案

一般做法是:

1) 为您的 XML 登录子类 AbstractAuthenticationToken,我们称之为 XMLAuthenticationToken。

2) 子类 AbstractAuthenticationProcessingFilter 并将其添加到 UsernamePasswordAuthenticationFilter 之后的过滤器链中。它应该基于 XML 中的数据创建一个 XMLAuthenticationToken。您可以使用 UsernamePasswordAuthenticationFilter 作为过滤器一般结构的示例(这很可能是您当前用于常规 Spring Security 登录的过滤器)。

<http>
<custom-filter after="FORM_LOGIN_FILTER" ref="xmlAuthenticationFilter"/>
</http>

过滤器应该设置一个不同于 UsernamePasswordFilter 的 filterProcessesUrl。这是外部系统将 XML 发布到的 URL。例如:

public XmlAuthenticationFilter() {
super("/xml_security_check");
}

3) 子类 AbstractUserDetailsAuthenticationProvider。让它根据 token 中的信息从 UserDetailsS​​ervice 中查找用户,然后对其进行身份验证。以 DaoAuthenticationProvider 为例。您需要向 AuthenticationManager 注册新的提供程序。

<authentication-manager>
<authentication-provider user-service-ref='myUserDetailsService'/>
<authentication-provider ref="xmlAuthenticationProvider" />
</authentication-manager>

您也许可以重用 UsernamePasswordAuthenticationToken(对于 #1,它有一个很好的“详细信息”扩展机制)和 DaoAuthenticationProvider(或子类化它)用于 #3。

关于spring - 使用 Spring Security 集成单点登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5365054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com