Spring Security - 注销和访问控制不起作用

时间:2016-06-01 14:18:38

标签: java spring spring-mvc spring-security

所以我在spring config xml文件中有这个。

<http auto-config="true" use-expressions="true">

    <intercept-url pattern="/welcome/*" access="hasRole('ADMIN')" />

    <!-- <intercept-url pattern="/login" requires-channel="https" /> -->

    <!-- access denied page -->
    <access-denied-handler error-page="/403" />

    <form-login login-page="/login" 
        default-target-url="/welcome"
        authentication-failure-url="/login?error" 
        username-parameter="emailId"
        password-parameter="pwd" />
    <logout logout-success-url="/login?logout"/>
</http>

在登录时正确验证角色。我有两个问题:

  1. pattern="/welcome/*"pattern="/welcome*"pattern="/welcome/**"之间的区别是什么?当pattern="/welcome/*"时,登录成功并且用户看到该页面。在其他两个选项中,将显示403 Access Denied页面。用户具有“ADMIN”权限)
  2. Spring安全流程如何注销?我在welcome.jsp文件中有以下代码:

    <c:url value="/logout" var="logoutUrl" />
    <form action="${logoutUrl}" method="GET" id="logoutForm">
        <input type="hidden" name="${_csrf.parameterName}"
        value="${_csrf.token}" />
    </form>
    <script>
    function formSubmit() {
    document.getElementById("logoutForm").submit();
    }
    </script>
    
    <c:if test="${pageContext.request.userPrincipal.name != null}">
        <h2>
        User : ${pageContext.request.userPrincipal.name} | <a
        href="javascript:formSubmit()"> Logout</a>
        </h2>
    </c:if>
    

    这在我的控制器中:

    @RequestMapping(value = "/logout", method = RequestMethod.GET)
    public String logoutPage(HttpServletRequest request,     HttpServletResponse response) {
        Authentication auth =     SecurityContextHolder.getContext().getAuthentication();
        if (auth != null) {
            new SecurityContextLogoutHandler().logout(request, response, auth);
        }
        return "redirect:/login?logout";
    }
    

    页面重定向正确并显示“注销成功”页面,但如果我更改URL以再次转到“/ welcome”,则会显示该页面。它不应该显示 403 - 拒绝访问页面

1 个答案:

答案 0 :(得分:1)

关于Spring Security中的Ant Path匹配器

使用Ant风格语法的主要作用是解析确切路径的有效性。

映射使用以下规则匹配URL:

  • ?匹配一个字符
  • *匹配零个或多个字符
  • **匹配路径中的零个或多个目录

关于你的案件:

  • /welcome/* - 这可能适用于/welcome/hello/welcome/#hello/welcome/?abc=123
  • 等网址
  • /welcome* - 有效期为/welcome?abc=123/welcome#abc=123
  • /welcome/** - 有效案例为/welcome/hello/bye?abc=123

有关此问题的更多信息,请访问Spring Documentation

退出操作

我假设你使用xml-configuration来提高安全性。无论如何,这可以修改为使用纯Java配置。

app-security.xml中应该是这样的:

<http use-expressions="true"
      disable-url-rewriting="true">

    <http-basic />

    <!-- other configurations -->

    <intercept-url pattern="/login**" access="isAnonymous()"/>
    <intercept-url pattern="/**" access="isAuthenticated()"/>

    <!-- other configurations -->
    <logout logout-url="/logout"
            logout-success-url="/login"/>
</http>

index.html档案中的某处:

<a href="<c:url value="/logout" />" id="item-btn-logout">
    <i class="icon-off"></i> Logout
</a>

最重要的部分是网址:/logout