我设法使用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提供程序,但我不知道我可以在哪里插入自己的类来编码用户的检查和注册。
最理想的是,我还想在创建用户之前检查特定的权限。
任何人都可以帮我一把吗?
答案 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特定错误(例如用户被阻止或密码已过期),现在它显示我的应用程序默认登录错误消息。