【问题标题】:How to enable Spring security?如何启用 Spring 安全性?
【发布时间】:2014-01-04 02:27:54
【问题描述】:

我想知道为什么我的 Spring 安全性不起作用。我有这个 spring-security.xml

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

     <http auto-config='true'>
        <intercept-url pattern="/**" access="ROLE_USER" />
        <port-mappings>
            <port-mapping http="8088" https="9443"/>
        </port-mappings>
    </http>

    <authentication-manager>
        <authentication-provider>
            <user-service>
                <user name="admin" password="password2" authorities="ROLE_USER" />
                <user name="jimi" password="jimispassword" authorities="ROLE_USER, ROLE_ADMIN" />
                <user name="bob" password="bobspassword" authorities="ROLE_USER" />
            </user-service>
        </authentication-provider>
    </authentication-manager>

</beans:beans>

然后我得到了这个 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/spring/admin-servlet-common.xml
            /WEB-INF/spring/admin-servlet-controller.xml
            /WEB-INF/spring/admin-servlet-security.xml
            /WEB-INF/spring/admin-servlet-service.xml
            /WEB-INF/spring-security.xml
            classpath:ses-service.xml
        </param-value>
    </context-param>

    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/log4j.xml</param-value>
    </context-param>

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


    <!-- 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>

    <!-- Enables clean URLs with JSP views e.g. /welcome instead of /app/welcome -->
    <filter>
        <filter-name>UrlRewriteFilter</filter-name>
        <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
    </filter>

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

    <!-- Spring Security -->
    <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>

    <!-- Handles all requests into the application -->
    <servlet>
        <servlet-name>ses</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>ses</servlet-name>
        <url-pattern>/app/*</url-pattern>
    </servlet-mapping>
</web-app>

但它既不提供错误消息也不启用安全性。我的 webapp 没有变化,我仍然可以浏览页面,例如http://localhost:8088/admin/loginhttp://localhost:8088/admin/menu 。这个项目是 web 应用程序的管理部分,我正在为管理 web 启用安全性。可以做什么?我想使用的我自己的登录页面是http://localhost:8088/admin/login,我想为管理员角色保护其余的 /admin* 页面。

【问题讨论】:

  • 在你的应用程序中放置一个断点并检查堆栈,是否甚至调用了弹簧安全过滤器?
  • 我猜你的 spring 安全文件被命名为 admin-servlet-security.xml ?因为如果不是,您需要将其添加到 web.xml 中的 contextConfigLocation 列表中

标签: java spring spring-security


【解决方案1】:

UrlRewriteFilter 列在最前面,它将通过转发到应用程序中的其他位置来绕过 Spring Security。一般来说,springSecurityFilterChain 应该是 web.xml 中的第一个,以确保它拦截所有请求。

我还考虑一起删除 UrlRewriteFilter(因为它可能会在您的拦截 URL 中造成非常混乱的映射。过去,它用于删除分配给 Springs DispatcherServlet 的 /app 映射,这可以通过映射轻松避免DispatcherServlet 到 /

<servlet-mapping>
  <servlet-name>ses</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

你可以在Spring Security forums找到更多关于 Spring Security 和 UrlRewriteFilter 的讨论

【讨论】:

    【解决方案2】:
    <intercept-url pattern="/**" access="ROLE_USER" />
    

    这是否意味着您允许具有 ROLE_USER 的用户访问所有页面(所有 3 个用户都具有该角色)?

    <intercept-url pattern="/admin/**" access="ROLE_ADMIN" />
    <intercept-url pattern="/**" access="ROLE_USER" />
    

    应该只允许具有 ROLE_ADMIN 的用户访问管理员页面,以及其他页面,因为它现在可以工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      • 2015-12-07
      • 2014-10-29
      • 2018-08-15
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多