#java #spring #servlets #spring-security #servlet-filters
Вопрос:
У меня развернут сервлет Myservlet.java
@Configurable
public class MyServlet extends HttpServlet {
@Autowired
MyService service;
@Override
public void init(ServletConfig config) throws javax.servlet.ServletException{
super.init(config);
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) {
//Do something here
}
Теперь безопасность для этого включена в web.xml как :
<security-constraint>
<web-resource-collection>
<web-resource-name>myServlet</web-resource-name>
<url-pattern>/myUrl/*</url-pattern>
<http-method>HEAD</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>user</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
<security-role>
<role-name>user</role-name>
</security-role>
Но там, где это весеннее приложение развернуто, уже включена защита spring с помощью @EnableWebSecurity
Контроллеры, развернутые в приложении spring, все правильно проходят проверку подлинности, как и ожидалось. Но сервлет не проходит аутентификацию с помощью spring security. Я считаю, что то, что упомянуто в документе, мешает ему аутентифицироваться.
Как заставить сервлет работать с Spring security ?
Правка 1: Конфигурация безопасности Spring: (Обратите внимание, что это синтаксически неверно), но пользователь/роль и источник данных в моем коде все правильно. Он отлично работает для других API-интерфейсов REST, развернутых в приложении spring
@Configuration
@EnableWebSecurity(debug = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
String user_query = "select user from userTable where id=9999";
String role_query = "select role from roleTable where id=6666";
logger.info("Using the following query for role : " role_query);
auth.
jdbcAuthentication()
.dataSource(dataSource) //Datasource is injected to this class
.usersByUsernameQuery(user_query)
.passwordEncoder(passwordEncoder())
.authoritiesByUsernameQuery(role_query);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.anyRequest().hasRole("myrole")
.and()
.httpBasic();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(runAsAuthenticationProvider());
}
@Autowired
protected RunAsManager runAsManager() {
RunAsManagerImpl runAsManager = new RunAsManagerImpl();
runAsManager.setKey("MyRunAsKey");
return runAsManager;
}
Комментарии:
1. Если вы используете full Spring, почему вы пишете сервлеты вручную, а не используете Spring MVC?
2. @Sach106 Ваша конфигурация выглядит нормально.
.anyRequest().hasRole("myrole")
должно работать для вашего сервлета. Но помните, что если вы используете базовую аутентификацию, ваш браузер автоматически отправляет учетные данные при каждом запросе. Поэтому , если вы вошли в систему с пользователем с рольюmyrole
, вы можете получить доступ к своему сервлету.