登录时自动创建新用户帐户

时间:2014-04-15 20:44:35

标签: spring-security ldap

我设法使用spring-security使我的应用程序使用Active Directory(基本上是LDAP),如下所示:

<authentication-manager>
    <authentication-provider ref="ldapActiveDirectoryAuthProvider" />
</authentication-manager>

<beans:bean id="grantedAuthoritiesMapper" class="mypackage.ActiveDirectoryGrantedAuthoritiesMapper"/>
    <beans:bean id="ldapActiveDirectoryAuthProvider" class="org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider">
    <beans:constructor-arg value="xxxx.xxx.xxxx" />
    <beans:constructor-arg value="ldap://xxx.xxx.xxx.xxx:389" /> 
    <beans:property name="authoritiesMapper" ref="grantedAuthoritiesMapper" />
    <beans:property name="useAuthenticationRequestCredentials" value="true" />
    <beans:property name="convertSubErrorCodesToExceptions" value="true" />
</beans:bean> 

但是通过这样做,我需要让用户在我的应用程序和Active Directory中注册。我希望能够在用户登录之前(但在Active Directory验证之后)查看他是否存在于我的数据库中,以及他是否在我的应用程序中创建新用户然后正常进行。 / p>

我相信我需要创建一个preAuthentication提供程序,但我不知道我可以在哪里插入自己的类来编码用户的检查和注册。

最理想的是,我还想在创建用户之前检查特定的权限。

任何人都可以帮我一把吗?

1 个答案:

答案 0 :(得分:0)

最后,我不得不在AuthenticationSuccess上更改我的身份验证处理程序。在Spring中,在登录过程的生命周期中存在身份验证和登录。在身份验证期间,用户已经过身份验证,但尚未登录到应用程序中(即只有其凭据被认为有效,但应用程序的其余部分尚未了解用户。)

我将security.xml更改为:

<beans:bean id="authHandler" class="mypackage.activedirectory.ActiveDirectoryAuthenticationHandler" 

...

<form-login login-page="/login" authentication-failure-handler-ref="authHandler"
            authentication-success-handler-ref="authHandler" />

这是班级:

public class ActiveDirectoryAuthenticationHandler extends MyAuthenticationHandler {

@Autowired
private UserService userService;

@Override
public void onAuthenticationSuccess(HttpServletRequest req, HttpServletResponse resp, Authentication auth)
        throws IOException, ServletException {
    String username= auth.getName();
    User user= userService.findByUsername(username);
    if (user == null) {
        user= new User();
                    //set user properties
    }

    try {
        userService.save(user);
    } catch (EntityException e) {
        System.out.println(e.getMessage());
    }

    super.onAuthenticationSuccess(req, resp, auth);
}
}

我仍然没有想出如何处理AD特定错误(例如用户被阻止或密码已过期),现在它显示我的应用程序默认登录错误消息。