Как включить существующую защиту spring для данного сервлета?

#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 , вы можете получить доступ к своему сервлету.