Я тоже потратил много часов на изучение того, как реализовать настраиваемую авторизацию без аутентификации.
Процесс аутентификации является внешним по отношению к нашей системе (на основе единого входа). Я сделал это, как указано ниже, и это работает !!! (Я уверен, что есть много других способов сделать это лучше, но этот способ достаточно хорошо подходит для моего сценария)
Сценарий: Пользователь уже аутентифицирован внешней системой, и вся информация, необходимая для авторизации, присутствует в запросе.
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
person
tigersagar
schedule
27.11.2018