多个登录端点Spring Security OAuth2

时间:2018-03-28 21:30:31

标签: spring spring-boot spring-security spring-security-oauth2 spring-oauth2

我正在尝试为不同的用户角色(带有Spring Boot 2的Spring Security OAuth2)实现多个登录策略,并且每个策略都应使用不同的端点。我有3个用户类型,REGULAR, EXTERNAL, CLIENT,其中常规登录vía用户名/密码,外部登录通过documentId / key,客户端在获取当前密码之前做了一些短信恶作剧,并用电话/密码登录。他们已经可以从常规网站登录,但他们将为每个角色提供移动应用程序。

我尝试使用AuthorizationServer创建多个@EnableAuthorizationServer个实例,每个实例都有一个配置,但它只会获取最后一个。{1}}实例。每个角色都有一个不同的UserDetailsService impl,并且在DB中创建了一个应用程序。我希望公开它们,以便客户端应用使用/client/oauth/...,常规应用使用/regular/oauth/...,外部应用使用/external/oauth/...如何实现此目标?

1 个答案:

答案 0 :(得分:0)

如果您使用的是spring security和oauth2,并且想要获得许多不同的登录端点,则可能需要自定义 AuthenticationEntryPoint

@Component
public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint {

    private final RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();

    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response,
        AuthenticationException authException) throws IOException, ServletException {
        String clientId = request.getParameter("client_id");
        String redirectUrl = "/login";
        HttpSession session = request.getSession();
        session.setAttribute(SessionSaveAttribute.CLIENT_ID_ATR, clientId);
        //echoSessionAtr(request);
        redirectStrategy.sendRedirect(request, response, redirectUrl);
    }

}

因此,您可以通过制定条件来自定义登录端点。

if(clientId=="REGULAR_CLIENT_ID"){
    redirectUrl = "regular/login"
} else if(clientId=="SPECIAL_CLIENT_ID"){
    redirctUrl = "...";
}