在struts2中使用spring security总是显示访问被拒绝页面
Posted
技术标签:
【中文标题】在struts2中使用spring security总是显示访问被拒绝页面【英文标题】:always showing access denied page using spring security in struts2 【发布时间】:2015-08-09 04:29:43 【问题描述】:我正在使用 spring security 开发一个简单的struts2
登录页面。问题是每当我登录时,无论用户是否有效,它总是显示我的自定义访问被拒绝页面。我不明白这个错误,因为除了警告之外没有显示任何错误:
org.apache.struts2.components.ServletUrlRenderer.warn 在命名空间“/”中找不到指定操作的配置:“j_spring_security_check”。表单动作默认为 'action' 属性的字面值。
我的 web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext-security.xml
</param-value>
</context-param>
<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>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>/jsp/index.jsp</welcome-file>
</welcome-file-list>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
我的 applicationContext-security.xml
<http auto-config="true">
<intercept-url pattern="/direct.action" access="permitAll()" />
<intercept-url pattern="/admin.action" access="hasRole('ROLE_Admin')" />
<access-denied-handler error-page="/jsp/deniedAccess.jsp" />
<form-login login-page="/jsp/login.jsp" default-target-url="/admin.action"
authentication-failure-url="/validateUser.action?error"
username-parameter="username" password-parameter="password" />
<logout logout-success-url="/logout.action?logout" />
</http>
<authentication-manager>
<authentication-provider>
<user-service>
<user name="user" password="user" authorities="ROLE_User" />
<user name="admin" password="admin" authorities="ROLE_USER" />
</user-service>
</authentication-provider>
</authentication-manager>
struts.xml
<struts>
<package name="default" extends="struts-default" namespace="/">
<action name="direct" class="action.LogAction" method="reDirect">
<result name="success">/jsp/login.jsp</result>
</action>
<action name="admin" class="action.LogAction" method="directAdmin">
<result name="success">/admin/adminHome.jsp</result>
</action>
<action name="validateUser" class="action.LogAction" method="errorDirect">
<result name="success">/jsp/login.jsp</result>
</action>
<action name="logout" class="action.LogAction" method="directLogout">
<result name="success">/jsp/login.jsp</result>
</action>
</package>
index.jsp
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Redirecting...</title>
</head>
<body>
Redirecting...
<META HTTP-EQUIV="Refresh" CONTENT="0;URL=direct.action">
</body>
我不知道是什么错误。任何帮助将不胜感激
login.jsp
<s:form action="j_spring_security_check" namespace="/" method="post">
<s:textfield name="username" label="Username"/>
<s:password name="password" label="Password"/>
<s:submit align="center" value="Login"/>
</s:form>
【问题讨论】:
在您的登录页面中使用<form>
标签而不是S2 <s:form>
标签。
j_spring_security_check
不是一个动作,您应该从映射中排除它。
@Roman 先生,正如你所说,我从映射中删除了 j_spring_security_check,但仍然没有变化
显示您的login.jsp
。
现在阅读我的第一条评论并关注它。
【参考方案1】:
您的 login.jsp 表单标记指向 j_spring_security_check,这不是您的 struts.xml 中的操作名称。将其更改为将处理登录帖子的任何操作名称。
如果你在action.LogAction中写了一个方法(或者实现了execute())来实际处理你的登录,你需要在struts.xml中同时提供一个成功和失败的结果,成功的结果应该把用户带到成功登录后他们应该在哪里,失败结果将他们带回登录 jsp。有关详细信息,请参阅 struts 文档here。
【讨论】:
以上是关于在struts2中使用spring security总是显示访问被拒绝页面的主要内容,如果未能解决你的问题,请参考以下文章
struts2的Action中使用spring的@Transactional注解事务出错
在struts2中使用spring security总是显示访问被拒绝页面