Двухсторонний вход в мое приложение Spring web MVC - PullRequest
2 голосов
/ 21 апреля 2020

Приложение построено на Spring web MVC. Версия Spring Security - 3.1.0. Приложение уже имеет систему аутентификации на основе формы входа.

Теперь я хочу представить другую систему аутентификации (наряду с существующей) для всего приложения. Требования к новой системе аутентификации приведены ниже:

  1. пользователь получит указанную конечную точку контроллера c
  2. браузер сгенерирует запрос к серверу, а заголовок запроса будет содержать зашифрованный токен в качестве учетных данных.
  3. Сервер прочитает токен и расшифрует токен.
  4. Сервер проверит информацию пользователя, полученную из расшифрованного токена.
  5. Сервер будет перенаправлять после успешной аутентификации на основной 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?

...