Spring Boot中的复杂身份验证

时间:2016-01-07 15:00:55

标签: java spring authentication spring-boot

我正在尝试使用外部提供程序从Spring Boot应用程序完成身份验证,我需要为第三方软件设备编写代码。该应用程序在该外部软件上发出命令,因此需要用户凭证才能连接和操作。

需要使用表单中提供的用户名和密码对Active Directory数据库执行身份验证(检查用户是否存在于公司中),然后使用内部数据库告诉应用程序是否允许用户使用应用程序以及他是否是管理员(稍后用于自定义菜单栏)。 然后,通过服务器上存在的二进制可执行文件(使用ProcessBuilder),使用此外部软件对用户进行身份验证。这有点复杂,但由于外部约束,这就是必须的。

此外,一旦用户在此第三方软件中进行了身份验证,他必须从列表中选择一个角色,该列表包含该用户可用的所有角色。只有在此之后,才会建立连接,我们必须将用户重定向到他可以使用该应用程序的主页面。

登录页面显示一个包含用户名和密码字段的表单,以及一个触发身份验证过程并向用户显示角色列表的按钮,选择一个并单击另一个按钮后,将选择角色和用户将被重定向到主页。

问题是我没有任何线索可以在Spring Boot中实现它。

我的LoginController包含:

@Inject
public LoginController(final LoginService loginService) {
    this.loginService = loginService;
}

@RequestMapping("/login.html")
public ModelAndView getLoginView() {
    LOGGER.debug("Received request to get login view");
    ModelMap model = new ModelMap();
    model.addAttribute("authenticationTypes",loginService.getAuthenticationTypes());
    model.addAttribute(loginService);
    return new ModelAndView("login", model);
}

我在一个较旧的JSF应用程序中使用的LoginServiceImpl模块中有工作代码,该应用程序想要重用但不知道如何。

1 个答案:

答案 0 :(得分:2)

与类似的答案here类似,您需要创建自己的 CustomAuthenticationProvider ,必须 实现AuthenticationProvider < /强>

例如:

@Component
public class CustomAuthenticationProvider
implements AuthenticationProvider {

@Autowired
private ThirdPartyClient thirdPartyClient;

public void setAtpClient(ThirdPartyClient atpClient) {
    this.thirdPartyClient = atpClient;
}

@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
    String username = authentication.getName();
    String password = authentication.getCredentials().toString();


    Request3rd requestTO = new AtpAuthenticateRequestDTO();
    requestTO.setPassword(password);
    requestTO.setUsername(username);
    Response3rd authenticate = this.thirdPartyClient.authenticate(requestTO);

    if (authenticate != null) {
        List<GrantedAuthority> grantedAuths = new ArrayList<>();
        grantedAuths.add(new SimpleGrantedAuthority("ROLE_USER"));
        Authentication auth = new UsernamePasswordAuthenticationToken(authenticate.getUsername(), password, grantedAuths);
        return auth;
    } else {
        return null;
    }
}

@Override
public boolean supports(Class<?> authentication) {
    return authentication.equals(UsernamePasswordAuthenticationToken.class);
}

}

然后在 SecurityConfig 类中,该类在此配置方法中扩展 WebSecurityConfigurerAdapter 覆盖:

@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.authenticationProvider(this.authenticationProvider);
}

您可以自动装配之前创建的 customAuthenticationProvider

@Autowired
private CustomAuthenticationProvider authenticationProvider;