Я тоже потратил много часов на изучение того, как реализовать пользовательскую авторизацию без аутентификации.
Процесс аутентификации является внешним для нашей системы (на основе единого входа).
Я сделал это, как указано ниже, и это работает !!! (Я уверен, что есть много других способов сделать это лучше, но этот способ достаточно хорошо подходит для моего сценария)
Сценарий: пользователь уже аутентифицирован во внешней системе, и вся информация, необходимая для авторизации, присутствует в запросе
1.
Необходимо создать конфигурацию безопасности, включив глобальную защиту методов, как показано ниже.
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
class SpringWebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(final HttpSecurity http) throws Exception {
}
}
2.) Внедрите Spring PermissionEvaluator, чтобы разрешить, следует ли разрешить или отклонить запрос
@Component
public class CustomPermissionEvaluator implements PermissionEvaluator {
public boolean authorize(final String groups, final String role) {
boolean allowed = false;
System.out.println("Authorizing: " + groups + "...");
if (groups.contains(role)) {
allowed = true;
System.out.println(" authorized!");
}
return allowed;
};
@Override
public boolean hasPermission(final Authentication authentication, final Object groups, final Object role) {
return authorize((String) groups, (String) role);
};
@Override
public boolean hasPermission(final Authentication authentication, final Serializable targetId, final String targetType, final Object permission) {
return authorize((String) targetId, (String) permission);
};
}
3.) Добавить MethodSecurityConfig
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
@Override
protected MethodSecurityExpressionHandler createExpressionHandler() {
DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler();
expressionHandler.setPermissionEvaluator(new CustomPermissionEvaluator());
return expressionHandler;
}
}
4.) Добавьте @PreAuthorize в свой контроллер, как показано ниже. В этом примере все группы пользователей присутствуют в заголовке запроса с ключом «availableUserGroups».
Затем он передается в CustomPermissionEvaluator для проверки авторизации. Обратите внимание, что spring автоматически передает объект аутентификации в метод hasPermission.
Так что, если вы хотите загрузить пользователя и проверить с помощью метода hasRole пружины, то это можно использовать.
@PreAuthorize("hasPermission(#userGroups, 'ADMIN')")
@RequestMapping(value = "/getSomething")
public String getSomething(@RequestHeader(name = "availableUserGroups") final String userGroups) {
return "resource allowed to access";
}
Обработка других сценариев:
1.) В сценарии, где вы хотите загрузить пользователя, прежде чем вы сможете выполнить авторизацию. Вы можете использовать пружинные фильтры до аутентификации и делать это аналогичным образом.
Пример ссылки: http://www.learningthegoodstuff.com/2014/12/spring-security-pre-authentication-and.html