Добавление пользователя в сеанс, весенний вход по умолчанию - PullRequest
6 голосов
/ 18 октября 2011

Я настроил Spring Security для правильного перехвата и запроса пользователя с пользовательской страницей входа, которая затем корректно аутентифицируется и добавляет детали пользователя в SecurityContextHolder.

В дополнение к этому теперь я хочу добавить свой собственный пользовательский объект User, добавляемый в сеанс при каждом входе в систему; поэтому код будет выглядеть так:

public returnwhat? doMySupplementaryLogin() {

   UserDetails principal = (UserDetails) SecurityContextHolder.getContext()
                                .getAuthentication().getPrincipal();
   MyUser user = myUserService.getMyUser(principal.getUsername());

   add user to what ?
}

Куда пойдет этот код? Я хочу, чтобы была выполнена проверка подлинности с использованием обычной пружины, а затем приведенный выше код поместит объект MyUser в сеанс, а затем отправит пользователя на исходный перехваченный URL / имя представления. У меня сильное чувство, что я все усложняю, чем нужно ...

Ответы [ 2 ]

10 голосов
/ 18 октября 2011

Вы все усложняете ...:)

То, что вы хотите, - это добавить собственного провайдера аутентификации в обычный менеджер аутентификации Spring.Поэтому вы должны настроить диспетчер аутентификации следующим образом:

    <security:authentication-manager alias="authenticationManager">
      <security:authentication-provider user-service-ref="authServiceImpl">
        <security:password-encoder ref="passwordEncoder"/>
      </security:authentication-provider>
    </security:authentication-manager>
    <bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.Md5PasswordEncoder"/>

Теперь вам нужно только определить bean-компонент authServiceImpl в контексте Spring.Вы можете сделать это через xml или аннотации (мой предпочтительный способ).

@Service
public class AuthServiceImpl implements AuthService {

Вам необходимо реализовать интерфейс AuthService.Просто реализовать методы из интерфейса - должно быть довольно просто.Вам не нужно помещать вещи в SecurityContextHolder самостоятельно - Spring сделает это.

То, что вы хотите, это:

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {
     return MyUser user = myUserService.getMyUser(username);
}

Не стесняйтесь спрашивать, если у вас есть какие-либо дополнительные вопросы.

РЕДАКТИРОВАТЬ: Или вы могли бы просто реализовать класс UserService для реализации интерфейса - я просто сделал это так, потому что вы не предоставили свой класс UserService.

1 голос
/ 15 апреля 2019

или добавьте свой собственный AuthenticationSuccessHandler, например, этот класс, я добавил, чтобы я мог хранить имя пользователя и пароль в сеансе, чтобы при необходимости мог войти в другие микросервисы:

public class AuthenticationSuccessWithSessionHandler extends SavedRequestAwareAuthenticationSuccessHandler implements AuthenticationSuccessHandler, LogoutSuccessHandler {

    public static final String USERNAME = "username";
    public static final String PASSWORD = "password";

    @Override
    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
        request.getSession().removeAttribute(USERNAME);
        request.getSession().removeAttribute(PASSWORD);
    }

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
        super.onAuthenticationSuccess(request, response, authentication);
        request.getSession().setAttribute(PASSWORD, request.getParameter(PASSWORD));
        request.getSession().setAttribute(USERNAME, request.getParameter(USERNAME));
    }
}

и зарегистрировал

        AuthenticationSuccessWithSessionHandler successHandler = new AuthenticationSuccessWithSessionHandler();
        http.authorizeRequests().antMatchers("/login", "/logout", "/images", "/js").permitAll().antMatchers("/feeds/**")
                .authenticated().and().formLogin()
                .successHandler(successHandler)
                .and().logout().logoutUrl("/logout").logoutSuccessHandler(successHandler).logoutSuccessUrl("/login");

обратите внимание, что extends SavedRequestAwareAuthenticationSuccessHandler сохраняет исходный URL-адрес и восстанавливает его после успешного входа в систему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...