Предварительная аутентификация Spring Security

Меня попросили изменить веб-приложение, созданное на Java EE+Spring+Hibernate, чтобы обеспечить безопасность с помощью Spring Security.

Я раньше не работал с Spring Security, я читал документацию, но не вижу правильного способа заставить ее работать.

У нас есть страница входа, в которую встроена другая страница с фактической формой входа, эта форма вызывает действие входа в другое веб-приложение и вызывает один из методов нашего приложения с результатом входа. (Встроенная страница входа является частью «чужого» веб-приложения, которое обрабатывает вход).

Я не понимаю, как я должен настроить Spring Security. Я предполагаю, что это сценарий предварительной аутентификации, но я понятия не имею, как мне заставить это работать.

Это мой файл security-context.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:security="http://www.springframework.org/schema/security"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
       http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">

    <!-- preauthentication -->    
    <security:global-method-security pre-post-annotations="enabled">
    </security:global-method-security>

   <security:http auto-config="false" use-expressions="true" entry-point-ref="http403EntryPoint" access-denied-page="/403.jsp">
        <security:intercept-url pattern="/" access="permitAll"/>
        <security:intercept-url pattern="/403.jsp" access="permitAll"/>
        <security:intercept-url pattern="/gestion/**" access="permitAll"/>
        <security:intercept-url pattern="/consulta/**" access="hasRole('ROLE_ADMIN')"/>
        <security:intercept-url pattern="/importacion/**" access="hasRole('ROLE_ADMIN')"/>
        <!-- Allow non-secure access to static resources  -->
        <security:intercept-url pattern="/resources/**" access="permitAll"/>

        <security:logout logout-success-url="/"/>
    </security:http>

    <bean id="http403EntryPoint" class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint">
    </bean>

    <bean id="filterChainProxy" class="org.springframework.security.web.FilterChainProxy">
        <security:filter-chain-map path-type="ant">
            <security:filter-chain pattern="/**" filters="j2eePreAuthFilter"/>
        </security:filter-chain-map>
    </bean>


    <security:authentication-manager alias="authenticationManager">
        <security:authentication-provider ref='preAuthenticatedAuthenticationProvider'/>
    </security:authentication-manager>

    <bean id="preAuthenticatedAuthenticationProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
        <property name="preAuthenticatedUserDetailsService" ref="preAuthenticatedUserDetailsService"/>
    </bean>

    <bean id="preAuthenticatedUserDetailsService"
            class="org.springframework.security.web.authentication.preauth.PreAuthenticatedGrantedAuthoritiesUserDetailsService"/>


    <bean id="j2eePreAuthFilter" class="es.myapp.security.MyUserJ2eePreAuthenticatedProcessingFilter">
        <property name="authenticationManager" ref="authenticationManager"/>
        <property name="authenticationDetailsSource" ref="authenticationDetailsSource"/>
        <property name="continueFilterChainOnUnsuccessfulAuthentication" value="false"/>
    </bean>

  <bean id="authenticationDetailsSource" class="org.springframework.security.web.authentication.preauth.j2ee.J2eeBasedPreAuthenticatedWebAuthenticationDetailsSource">
    <property name="mappableRolesRetriever" ref="j2eeMappableRolesRetriever"/>
    <property name="userRoles2GrantedAuthoritiesMapper" ref="j2eeUserRoles2GrantedAuthoritiesMapper"/>
  </bean>

  <bean id="j2eeMappableRolesRetriever" class="org.springframework.security.web.authentication.preauth.j2ee.WebXmlMappableAttributesRetriever">
  </bean>

   <bean id="j2eeUserRoles2GrantedAuthoritiesMapper" class="org.springframework.security.core.authority.mapping.SimpleAttributes2GrantedAuthoritiesMapper">
    <property name="attributePrefix" value="test"/>
  </bean>


</beans>

И мой web.xml

<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>Aplicación Web</display-name>

    <!-- Define la localización de los ficheros de configuración de Spring -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/classes/applicationContext.xml
        </param-value>
    </context-param>

    <!-- Reads request input using UTF-8 encoding -->
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>myUserJ2eePreAuthenticatedProcessingFilter</filter-name>
        <filter-class>es.myapp.security.MyUserJ2eePreAuthenticatedProcessingFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>myUserJ2eePreAuthenticatedProcessingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- Handles all requests into the application -->
    <servlet>
        <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
        <servlet-class>es.myapp.controller.MyDispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/servlet-context.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!-- del. welcome files -->
    <!-- useful for Servlet 3 container (Tomcat 7 and Jetty 6) -->
    <welcome-file-list>
        <welcome-file></welcome-file>
    </welcome-file-list>

    <!-- Referencia a recursos jndi WAS -->
    <resource-ref id="ResourceRef_XISCO">
        <res-ref-name>jdbc/myapp</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
        <res-sharing-scope>Shareable</res-sharing-scope>
    </resource-ref>

</web-app>

person diminuta    schedule 20.08.2012    source источник
comment
Когда вы говорите J2EE (обратите внимание, теперь это JEE), что именно вы имеете в виду? Вы используете SpringMVC? Spring Security просто запрещает доступ к определенным URL-адресам или службам на основе уровня аутентификации пользователей. Прочтите static.springsource.org/spring-security/site/tutorial. html   -  person david99world    schedule 20.08.2012
comment
Какой у Вас вопрос? Что ты пробовал? Пожалуйста, будьте более конкретными.   -  person Xaerxess    schedule 20.08.2012
comment
Вы имеете в виду Spring Security 2 или 3? Большая разница.   -  person Adriaan Koster    schedule 20.08.2012
comment
Я только что отредактировал свой исходный вопрос, чтобы вы могли видеть содержимое моих файлов security-context.xml и web.xml.   -  person diminuta    schedule 22.08.2012


Ответы (1)


при успешном входе в систему из другого приложения, когда метод вызывается в приложении вызывающего абонента. вы должны создать объект аутентификации и установить его в качестве держателя контекста безопасности.

    UserDetails user = userDetailsManager.loadUserByUsername(username);
    Authentication auth = new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());
    SecurityContextHolder.getContext().setAuthentication(auth);

не уверен, что это лучший способ сделать, но это может решить вашу проблему.

person Jigar Parekh    schedule 21.08.2012
comment
Я использую Spring MVC. Я попробовал несколько конфигураций в файле security-context.xml, но ни одна из них не сработала. Я имею в виду, что Spring Security был запущен и работал, но разработанные мной фильтры и службы были проигнорированы... Я имею в виду, что я защитил некоторые URL-адреса, и когда я попытался ввести эти URL-адреса, меня перенаправили на страницу 403 без ввода фильтра, который должен был проверьте мои данные... - person diminuta; 22.08.2012
comment
Я бы опубликовал одну из этих конфигураций, чтобы вы могли сказать мне, что я делаю неправильно. Я еще не опубликовал его, потому что мне было интересно, не могли бы вы указать какой-нибудь пример, которому я мог бы следовать... - person diminuta; 22.08.2012
comment
О, и это Spring Security 3 - person diminuta; 22.08.2012
comment
Я пробовал это, но это не сработает... Я думаю, проблема в том, что я что-то упустил в конфигурации... Я поставил точки останова в фильтре и сервисе, и при отладке это не так. пройти через фильтр... и я могу войти на защищенные страницы, несмотря на то, что у меня нет авторизованной роли... - person diminuta; 24.08.2012
comment
Теперь, если я защищу методы с помощью @preauthorize, это сработает, но не работает фильтрация jsp... спасибо! - person diminuta; 24.08.2012