Приложение построено на Spring web MVC. Версия Spring Security - 3.1.0. Приложение уже имеет систему аутентификации на основе формы входа.
Теперь я хочу представить другую систему аутентификации (наряду с существующей) для всего приложения. Требования к новой системе аутентификации приведены ниже:
- пользователь получит указанную конечную точку контроллера c
- браузер сгенерирует запрос к серверу, а заголовок запроса будет содержать зашифрованный токен в качестве учетных данных.
- Сервер прочитает токен и расшифрует токен.
- Сервер проверит информацию пользователя, полученную из расшифрованного токена.
- Сервер будет перенаправлять после успешной аутентификации на основной URL-адрес приложения (например, example.com)
Для выполнения этих требований: Я реализовал, как показано ниже:
Spring- security. xml
<bean id="authEntryPoint" class="com.example.authProvider.AuthEntryPoint"/>
<bean id="authFilter" class="com.example.authProvider.AuthFilter"/>
<bean id="authProvider" class="com.example.authProvider.AuthProvider" />
<http pattern="/**/basic-login.html" create-session="stateless" use- expressions="true" auto-config="true"
authentication-manager-ref="authManager">
<intercept-url pattern="/secure/**" access="isFullyAuthenticated()"/>
<http-basic entry-point-ref="authEntryPoint"/>
<custom-filter ref="authFilter" before="FORM_LOGIN_FILTER" />
</http>
<authentication-manager id="authManager">
<authentication-provider ref="authProvider" />
</authentication-manager>
AuthEntryPoint. java
public class AuthEntryPoint extends BasicAuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authEx) throws IOException, ServletException {
response.addHeader("WWW-Authenticate", "Basic realm=" + getRealmName() + "");
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
PrintWriter writer = response.getWriter();
writer.println("HTTP Status 401 - " + authEx.getMessage());
}
@Override
public void afterPropertiesSet() throws Exception {
setRealmName("example.com");
super.afterPropertiesSet();
}
}
AuthFilter. java
public class AuthFilter extends OncePerRequestFilter{
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String xAuth = request.getHeader("Authorization");
String info = request.getHeader("encryptedInfo");
//decrypt the info and verify the info. if info not valid throw 401 status.
if (info != valid) {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Token-invalid");
} else {
filterChain.doFilter(request, response);
}
}
}
AuthProvider. java
public class AuthProvider implements AuthenticationProvider {
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String username = authentication.getName();
String password = (String) authentication.getCredentials();
User user= loadUserFromDB(username);
return new UsernamePasswordAuthenticationToken(user, password, authorities);
}
@Override
public boolean supports(Class<?> authentication) {
return authentication.equals(UsernamePasswordAuthenticationToken.class);
}
private User loadUserFromDB(String username)
throws UsernameNotFoundException, DataAccessException {
//implement to load user from db
return new User(username, password, true,
true, true, true,
Collections.singletonList(new SimpleGrantedAuthority("ROLE_USER")));
}
}
Как реализовать обработчик onAuthenticationSuccess
? как это базовый c процесс аутентификации?
Чтобы уточнить, посмотрите в теге <form-logn>
есть атрибут с именем authentication-success-handler-ref, куда я могу добавить обработчик onAuthenticationSuccess. но в теге <http-basic>
такого атрибута нет, верно? Так как же установить обработчик onAuthenticationSuccess?