【问题标题】:how to block the unauthorized user using Spring Security?如何使用 Spring Security 阻止未经授权的用户?
【发布时间】:2013-05-18 16:16:17
【问题描述】:

我是 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

的模式

当我给出像

这样的 URL
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 意味着 spring security 不将用户重定向到登录页面。

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

【问题讨论】:

  • 问题是spring security允​​许用户不询问凭证

标签: java spring spring-mvc spring-security


【解决方案1】:

目前,您默认允许使用

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

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

更好的做法是默认拒绝访问,这意味着将pattern="/**" 的访问权限设置为您拥有的最允许的角色或至少需要身份验证(例如使用access="isAuthenticated()")这样您就可以使用白名单方法并且不必担心缺少 url-patterns。

更新

评论注销问题。您重定向到自定义logout-url。该网址之外还有什么? spring 安全注销例程通过/j_spring_security_logout 调用,如果您不调用logout-url,这是默认设置,否则您应该在自定义注销例程中调用/j_spring_security_logout

【讨论】:

    【解决方案2】:

    尝试在拦截 url 模式中使用项目,而不是 jack 使用 ** ,然后使用您要限制的其余 url。

    例如。而是 /jack/upload-users 使用 /project/**/upload-users

    还要注意 IS_AUTHENTICATED_ANONYMOUSLY 用于允许用户访问,即使他没有在应用程序中进行身份验证。

    希望这对您有所帮助。干杯。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      • 2021-02-02
      • 1970-01-01
      • 2019-10-31
      相关资源
      最近更新 更多