0

在我的 Spring Security 中,我遇到了一个问题。当我访问 /admin、/client 甚至 /admin/addUser.jsp 之类的 url 时,它会将我返回到登录页面(根据需要),但是当我访问 /addUser(映射到 Spring MVC 控制器)之类的 url 时,它会返回我任何情况下的页面,即使用户未通过身份验证。我需要添加/删除/修改什么配置才能安全执行一切。

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:security="http://www.springframework.org/schema/security"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">

       <security:http auto-config="true" use-expressions="true"> <!--access-decision-manager-ref="accessDecisionManager"-->
            <security:intercept-url pattern="/login" access="permitAll"/>
            <security:intercept-url pattern="/admin*/**" access="hasRole('ROLE_ADMIN')"/>
            <security:intercept-url pattern="/client*/**" access="hasRole('ROLE_USER')"/>
            <security:form-login login-page="/login" default-target-url="/index" authentication-failure-url="/loginFail"
                                 authentication-success-handler-ref="redirectRoleStrategy"/>
            <security:logout logout-success-url="/logout" invalidate-session="true"/>
            <security:access-denied-handler error-page="/403"/>
       </security:http>

       <bean id="daoAuthenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
           <property name="userDetailsService" ref="userDetailsService"/>
       </bean>

       <bean id="authenticationManager" class="org.springframework.security.authentication.ProviderManager">
            <property name="providers">
                <list>
                    <ref local="daoAuthenticationProvider"/>
                </list>
            </property>
       </bean>

        <security:authentication-manager>
            <security:authentication-provider user-service-ref="userDetailsService"/>
        </security:authentication-manager>

        <bean id="redirectRoleStrategy" class="com.payment.system.util.RoleBasedAuthenticationSuccessHandler">
            <property name="roleUrlMap">
                <map>
                    <entry key="ROLE_ADMIN" value="/admin"/>
                    <entry key="ROLE_USER" value="/client"/>
                </map>
            </property>
        </bean>
</beans>

PS:顺便说一句,我的 IDEA 给我留下了一条<property name="providers">线,告诉我这个属性已被弃用。我应该将其替换为什么属性?

谢谢!

4

2 回答 2

1

只需添加

<security:intercept-url pattern="/**" access="isFullyAuthenticated()" />

毕竟你的拦截网址标签(我的意思是它必须是最后一个)

对于 PS 问题:如 javadoc 中所述,只需使用构造函数注入(通过constructor-arg标签)。

于 2013-02-27T15:55:55.310 回答
0

当您添加 Maksym 建议的配置时,它将解决您的身份验证问题。但它不会解决您的授权问题。具有 ROLE_USER 角色的用户将能够访问 /addUser。两种解决方案:

1) 将所有应该由 admin 访问的 URL 移动到 /admin**。这个解决方案可能很复杂。

2)用以下配置替换我的Maxim建议的配置:

<security:intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')" />

请注意,在这种情况下,角色 ROLE_USER 的用户将只能访问 URL /client*/**

如果您需要任何其他帮助,请告诉我。

此致,

Michael

PS我建议通过命名空间定义所有bean,如下所述:http: //static.springsource.org/spring-security/site/docs/3.0.x/reference/ns-config.html

它应该消除警告。

于 2013-02-28T08:41:38.510 回答