Spring Security - предварительная аутентификация - авторизация и установка ролей, определенных в БД

Аутентификация для нашего приложения происходит через агента siteminder, но авторизация контролируется через наше приложение.

Я использую org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter для проверки заголовка. Я также определил UserDetailsService для загрузки пользовательских данных.

Мне также нужно установить роль для пользователя, чтобы я мог использовать библиотеки тегов безопасности Spring и другие методы Spring для проверки роли и отображения параметров.

Как мне это реализовать?

Я попробовал приведенные ниже утверждения в моей реализации службы сведений о пользователе, но, похоже, не работает.

    Authentication auth = new UsernamePasswordAuthenticationToken(user, null, roles);
    SecurityContextHolder.getContext().setAuthentication(auth);

Я также читал о классе AbstractPreAuthenticatedProcessingFilter, но, похоже, это не может быть полезным для этой цели.

Любая помощь по этому вопросу будет очень полезна.

Спасибо!

1 ответ

Я пытался установить роли (используя утверждения в моем вопросе) в реализации UserDetailsService, и это не работало.

Решение-1: Я написал подкласс PreAuthenticatedAuthenticationProvider и переопределил метод authenticate, как показано ниже:

public class CustomPreAuthenticatedAuthenticationProvider extends PreAuthenticatedAuthenticationProvider {


    @Autowired
    DBConfig dbConfig;

    @Override
    public Authentication authenticate(Authentication authentication)throws AuthenticationException {
        Authentication auth = super.authenticate(authentication);

        User user = (User)auth.getPrincipal();

        Set<Role> roles = new HashSet<Role>();

        String[] rolesArray = dbConfig.getRoles(user.getAccessLevel());
        for(String role: rolesArray){
            Role r = new Role();
            r.setName(role);
            roles.add(r);
        }

        user.setRoles(roles);

        auth = new UsernamePasswordAuthenticationToken(user, null, roles);

        return auth;
    }


}

Решение-2: Я попытался установить роли в контроллере (домашней странице после аутентификации), и это сработало. Но похоже, Решение-1 является стандартным решением.

Другие вопросы по тегам