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 является стандартным решением.