use*_*206 8 java security spring struts2 spring-security
我已经完成了大量关于这个问题的谷歌搜索,到目前为止我找不到任何关于集成Struts2和Spring Security的教程.
我的问题是我如何集成Spring Security和Struts2?
我希望限制某些操作或页面,例如管理页面/网址只能由管理员和其他类似的东西访问,如果用户试图访问该页面,他或她将被重定向到另一个页面.
假设您需要保护/admin/*路径上可访问的内容.您需要在您的声明中声明Spring安全过滤器web.xml,Struts过滤器应该在之后,如果您正在访问/admin它将是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>/admin/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)
然后声明您的spring安全上下文:
<http>
<intercept-url pattern="/*" filters="none" />
<intercept-url pattern="/admin/**" access="ROLE_ADMIN" />
<intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<form-login login-page="/login" />
<logout logout-url="/logout" />
</http>
Run Code Online (Sandbox Code Playgroud)
我建议您使用该struts2-convention插件,以便像这样的URL /login自动绑定到名为let的类com.foo.bar.actions.LoginAction.同样的LogoutAction
现在/admin/*应该由Spring Security保护,其余应该直接转发到Struts2过滤器.
最后,在您的JSP中,您可以检查某人是否为Admin:
<sec:authorize access="hasRole('ROLE_ADMIN')">
<p>you are an admin</p>
</sec:authorize>
Run Code Online (Sandbox Code Playgroud)
其余的可以在任何Spring Security教程中找到.真正重要的是过滤器声明的顺序,弹簧安全必须是第一位的.
编辑:在谷歌搜索,也有这个链接可以帮助你.
这实际上非常简单 - Spring Security与Web框架无关:)
您需要定义Spring Security过滤器链 - 这是一个应该映射到所有请求的Java过滤器.过滤器将检查路径是否需要任何特权,如果是,则检查用户是否已登录并具有这些特权.
简单的设置示例.
web.xml(插入到现有的,与struts配置一起):
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:META-INF/spring/applicationContext-security.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<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>
Run Code Online (Sandbox Code Playgroud)
Spring安全配置(在contextConfigLocation参数中的web.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: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.1.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<http pattern="/js/**" security="none" />
<http pattern="/css/**" security="none" />
<http pattern="/images/**" security="none" />
<http auto-config="false" use-expressions="true">
<http-basic/>
<intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
<session-management session-fixation-protection="newSession" />
</http>
</beans:beans>
Run Code Online (Sandbox Code Playgroud)
您可以根据需要扩展它 - Spring的文档写得很好
您可以进行更简单的自动配置:
<http auto-config='true'>
<intercept-url pattern="/**" access="ROLE_USER" />
</http>
Run Code Online (Sandbox Code Playgroud)
以上选项可根据请求路径保护您的Web应用程序.您可能也希望保护这些操作.添加以下内容可以帮助您:
<global-method-security secured-annotations="enabled" pre-post-annotations="enabled" proxy-target-class = "true" />
Run Code Online (Sandbox Code Playgroud)
让我知道你需要什么功能,我可以指出你的方向.请记住,命名空间配置不是灵丹妙药 - 如果您需要一个非常自定义的解决方案,您可能需要自己配置所有的spring bean,但文档很好地解释了这一点.
| 归档时间: |
|
| 查看次数: |
11372 次 |
| 最近记录: |