Spring 3 MVC + 安全性

Posted

技术标签:

【中文标题】Spring 3 MVC + 安全性【英文标题】:Spring 3 MVC + Security 【发布时间】:2013-03-03 04:44:10 【问题描述】:

我有两个示例项目 - 第一个是 Spring 3 MVC 项目,第二个是 Spring 3 安全项目......两者都运行良好......但是当我尝试创建应用程序时,我同时实现了安全性和 MVC,我不知道如何使它工作。我的应用程序结构如下所示:

当我在 / 中有 jsp 页面时,安全性工作......但是当我想将它们放到 /WEB-INF/views 以便能够为它们映射 @Controller 时,它就不起作用了......有人可以建议我,在哪里以及改变什么,以使其与/WEB-INF/views/ 中的 JSP 一起工作?

我的配置文件:

/WEB-INF/spring/appServlet/servlet-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />

<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the $webappRoot/resources directory -->
<resources mapping="/resources/**" location="/resources/" />

<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix" value="/WEB-INF/views/" />
    <beans:property name="suffix" value=".jsp" />
</beans:bean>

<context:component-scan base-package="cz.cvut.fit" />

    <context:component-scan base-package="com.chickstarter.web" />
<resources location="/resources/**" mapping="/src/webapp/resources"/>


     </beans:beans>

/WEB-INF/spring/appServlet/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
 xmlns="http://java.sun.com/xml/ns/javaee"   
 xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
 <context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>/WEB-INF/spring/root-context.xml</param-value>
 </context-param>
 <listener>
 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
 <servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
 <url-pattern>/</url-pattern>
 </servlet-mapping>
<!-- START: 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>
<!-- END: Spring Security -->
 <servlet>
    <servlet-name>mvc-dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext-web.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
 <servlet-mapping>
    <servlet-name>mvc-dispatcher</servlet-name>
    <url-pattern>/data/*</url-pattern>
</servlet-mapping>
</web-app>

/src/main/resources/applicationContext-sexurity.xml

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

<security:http pattern="/login.jsp*" security="none"/>
<security:http pattern="/denied.jsp" security="none"/>

<security:http auto-config="true" access-denied-page="/denied.jsp" servlet-api-provision="false">
    <security:intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
    <security:intercept-url pattern="/edit/**" access="ROLE_EDIT"/>
    <security:intercept-url pattern="/admin/**" access="ROLE_ADMIN"/>
    <security:intercept-url pattern="/**" access="ROLE_USER"/>
    <security:form-login login-page="/login.jsp" authentication-failure-url="/denied.jsp"
                         default-target-url="/home.jsp"/>
    <security:logout/>
</security:http>

<security:authentication-manager>
    <security:authentication-provider>
        <security:user-service>
            <security:user name="adam" password="adampassword" authorities="ROLE_USER"/>
            <security:user name="jane" password="janepassword" authorities="ROLE_USER, ROLE_ADMIN"/>
            <security:user name="sue" password="suepassword" authorities="ROLE_USER, ROLE_EDIT"/>
        </security:user-service>
    </security:authentication-provider>
</security:authentication-manager>

 </beans>

【问题讨论】:

请给我两个演示项目 当然 :) 其中之一就是通过 Spring Tool Suite 创建的 Spring MVC 模板,可以在此处找到 Spring 安全项目jeenisoftware.com/spring-3-security-example 很棒的演示,感谢 dworza np ;) 如果您发现如何使其与 /WEB-INF/views/ 中的 Spring MVC 和 JSP 页面一起使用,请告诉我:D 【参考方案1】:

您无需使用处理程序即可直接访问某些 jsp。例如

<security:intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<security:form-login login-page="/login.jsp" authentication-failure-url="/denied.jsp"
                     default-target-url="/home.jsp"/>

因此,安全性将一直有效,直到它在根目录下找到您的登录、拒绝和 home jsp。

您可以做的最简单的事情是将它们更改为 /WEB-INF/views url。但是我认为直接访问jsp并不是一种做法。您应该使用处理程序方法。下面我举个例子。

@RequestMapping(value="login", method= RequestMethod.GET)
public String showLogin()
    return "login";

然后为请求映射 url 应用安全性。

<security:intercept-url pattern="login" access="IS_AUTHENTICATED_ANONYMOUSLY"/>

现在您的安全逻辑不再与您的文件物理位置绑定。保持松散耦合总是好的。

使用 springsecurity documentation 了解更多详情。

【讨论】:

但这直接是问题所在,我正在尝试解决...将 url 更改为 /WEB-INF/views/whatever 并尝试将其与控制器映射不起作用... :-/【参考方案2】:

首先,您在 web.xml 中定义了 2 个调度程序 servlet,一个加载 applicationContext,另一个加载 servlet-context。这真的有必要吗?如果你真的想分割文件,你可以在 servlet-context 中使用 import 标签。

其次,您还有 2 个&lt;resources&gt; 标签。第一个就足够了,因为路径扫描从 webapp 文件夹开始。

第三,让你的所有 jsp 只能从它们的控制器访问。排除您想在没有身份验证的情况下访问的网址:

&lt;security:intercept-url pattern="login/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/&gt;

Above 将排除以下控制器的RequestMapping 可访问的所有资源:

登录控制器:

@Controller
@RequestMapping("login")
public class LoginController 


    @RequestMapping(method = RequestMethod.GET)
    public String login(Authentication authentication)
    
        if ((authentication != null) && authentication.isAuthenticated())
        
            return "redirect:dashboard";
        
        return "login";
    

    @RequestMapping(value="doSomething", method = RequestMethod.POST)
    public String postLogin(Authentication authentication)
    
        // Something else
    


返回的“登录”会打开你InternalResourceViewResolver定义的页面,并会在WEB-INF/views下寻找页面。

在您的安全文件中,将所有路径从 jsp 路径更改为 RequestMapping 路径。

【讨论】:

1) 肯定不需要两个调度器 servlet...如您所见,我刚开始使用 spring,我对所有这些配置文件及其属性感到很困惑... 2) 啊所以...谢谢...之前没有发现这个:) 3) 我会尽快尝试,当我到达我的电脑时.. 然后我会通知你结果:) 谢谢 :) 它解决了我的问题,我希望我的代码现在更清晰 :)

以上是关于Spring 3 MVC + 安全性的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring MVC 应用程序中实现 Spring 安全性?

Embedded Jetty 无法识别 Spring MVC 安全性

Spring MVC集成测试弹簧安全问题,怎么解决

AngularJS 和 Spring MVC 安全性

面试官:Spring MVC 如何保证 Controller 的并发安全性?面试必问。。

Spring 安全会话管理和 Spring MVC 视图解析器错误