如何使用Spring Security阻止未经授权的用户?

时间:2013-05-23 10:33:27

标签: java spring spring-mvc spring-security

我是SpringSecurity的新手。

这是我的Spring-security-Context.xml文件

<?xml version="1.0" encoding="UTF-8"?>

<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="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.0.xsd
                        http://www.springframework.org/schema/security 
                        http://www.springframework.org/schema/security/spring-security-3.0.xsd">

    <http auto-config="true" path-type="ant">
        <form-login login-page="/jack/login" authentication-failure-url="/jack/login" default-target-url="/jack/home"  />

        <intercept-url pattern="/themes/**" access="IS_AUTHENTICATED_ANONYMOUSLY" filters="none" />
        <intercept-url pattern="/js/**" access="IS_AUTHENTICATED_ANONYMOUSLY" filters="none" />
        <intercept-url pattern="/jack/images/**" access="IS_AUTHENTICATED_ANONYMOUSLY" filters="none" />
        <intercept-url pattern="/jack/resources/**" access="IS_AUTHENTICATED_ANONYMOUSLY" filters="none" />
        <intercept-url pattern="/jack/**/*.png" access="IS_AUTHENTICATED_ANONYMOUSLY" filters="none" />
        <intercept-url pattern="/jack/**/*.jpg" access="IS_AUTHENTICATED_ANONYMOUSLY" filters="none" /> 
        <intercept-url pattern="/jack/upload-users" access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <intercept-url pattern="/jack/login" access="IS_AUTHENTICATED_ANONYMOUSLY" filters="none" />
        <intercept-url pattern="/jack/logincheck" access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <intercept-url pattern="/jack/logout" access="IS_AUTHENTICATED_ANONYMOUSLY" filters="none"/>
        <intercept-url pattern="/jack/sessionExpire" access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <intercept-url pattern="/jack/**" access="IS_AUTHENTICATED_REMEMBERED" />
        <intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
        <security:logout logout-url="/jack/logout"
            logout-success-url="/jack/login" invalidate-session="true" />
        <session-management invalid-session-url="/jack/logout" >
                <concurrency-control max-sessions="1" error-if-maximum-exceeded="false"  expired-url="/jack/logout"/>               
        </session-management>
        <security:custom-filter ref="expiredSessionFilter" after="REMEMBER_ME_FILTER"/>
    </http>




    <beans:bean id="expiredSessionFilter" class="com.jack.web.filter.ExpiredSessionFilter">
    </beans:bean>




    <!-- Authentication providers -->
     <beans:bean id="customAuthenticationProvider" class="com.jack.security.provider.CustomAuthenticationProvider" > 
        <!-- <security:custom-authentication-provider />  -->
        <!-- <beans:property name="userDetailsService"  ref="userDetailsService"/>  -->
    </beans:bean>


    <authentication-manager>
        <authentication-provider ref="customAuthenticationProvider" />
    </authentication-manager>

</beans:beans>

案例1: 在web.xml jack 是springcontext名称

security-context.xml中的

jack / jack / login

之类的模式

当我提供像

这样的网址时
localhost:8080/project/jack/login

这个春天的安全工作非常顺利

案例2: 在web.xml xxx 是springcontext名称

在security-context.xml中 jack / jack / login

之类的模式

我没有在securitycontext.xml中更改任何内容

当我给出

localhost:8080/project/xxx/login

spring security允​​许用户进入我的应用程序。

注销后,如果用户复制 - 粘贴主页url意味着弹簧安全     不会将用户重定向到登录页面。

如何将用户重定向到     春天登录页面还是我有其他选择?

2 个答案:

答案 0 :(得分:1)

尝试在intercept-url模式中使用项目,而不是使用插孔,然后使用**,然后使用其他要限制的网址。

EG。相反,/jack/upload-users使用/project/**/upload-users

并且还注意到 IS_AUTHENTICATED_ANONYMOUSLY 用于允许用户访问,即使他未在应用程序中进行身份验证。

希望这会对你有所帮助。欢呼声。

答案 1 :(得分:0)

目前,您默认允许使用

访问所有网址
  `<intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />`

因此,您需要将要保护的每个网址列入黑名单。 Spring安全性正在按照配置中列出的顺序检查模式。应用第一个匹配模式而无需进一步检查。因此,如果没有模式匹配,将应用pattern="/**"授予任何人访问权限。

更好的做法是默认拒绝访问,这意味着将pattern="/**"的访问权限设置为您拥有的最多权限角色,或者至少要求身份验证(例如使用access="isAuthenticated()")这样您就是使用白名单方法,不必担心丢失网址模式。

<强>更新

评论退出问题。您重定向到自定义logout-url。超出那个网址的是什么?弹出安全注销例程通过/j_spring_security_logout调用,如果您不调用logout-url,则默认调用例程,否则您应该在自定义注销例程中调用/j_spring_security_logout