Java 春季安全3.1
当我尝试使用带有Spring Security的自定义登录表单时,无论我输入的凭据是否正确,它都会不断将我返回到/admin/login页面。当我使用空的Java 春季安全3.1,java,spring-mvc,spring-security,Java,Spring Mvc,Spring Security,当我尝试使用带有Spring Security的自定义登录表单时,无论我输入的凭据是否正确,它都会不断将我返回到/admin/login页面。当我使用空的时,安全检查工作正常。但是一旦我添加了一个自定义的,我就会返回到同一个页面。我已尝试添加默认目标url=“admin/forSale”/>,但仍返回到登录页面。在提供正确的凭据并返回到登录页面后,我尝试访问受保护的url,然后再次返回到登录页面,因此我99%确定根本没有执行安全检查 我的jsp中的action=“创建一个指向http://loc
时,安全检查工作正常。但是一旦我添加了一个自定义的
,我就会返回到同一个页面。我已尝试添加默认目标url=“admin/forSale”/>
,但仍返回到登录页面。在提供正确的凭据并返回到登录页面后,我尝试访问受保护的url,然后再次返回到登录页面,因此我99%确定根本没有执行安全检查
我的jsp中的action=“
创建一个指向http://localhost:8080/sharleepark/admin/j_spring_security_check
。我认为过滤器仍然应该接收这些信息并相应地处理安全性
我确信我的控制器或JSP中有一个简单的错误,我没有意识到。我也在使用Tiles2模板,这可能是问题的一部分吗?我花了几天的时间在这上面,尝试了所有我能找到的spring安全教程,但都没有用,所以非常感谢您的帮助
spring-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="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-3.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd ">
<!-- Scans packages to auto declare the beans we require -->
<context:component-scan base-package="au.com.sharleepark.controller" />
<context:component-scan base-package="au.com.sharleepark.service" />
<context:component-scan base-package="au.com.sharleepark.hibernate" />
<context:component-scan base-package="au.com.sharleepark.helper" />
<mvc:annotation-driven />
<tx:annotation-driven />
<!-- Map our static resources to a friendly URL -->
<mvc:resources location="/static/" mapping="/static/**" />
<!-- Specify the view resolver that we wish to use -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" />
</bean>
<!-- Tell the tiles configurator where our tiles configuration files are located -->
<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
<property name="definitions">
<list>
<value>/WEB-INF/tiles.xml</value>
</list>
</property>
</bean>
<!-- Our datasource -->
<!-- Defines our connection to the database -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.SingleConnectionDataSource"
destroy-method="destroy">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://blah blah" />
<property name="username" value="" />
<property name="password" value="" />
<property name="suppressClose" value="true" />
<property name="autoCommit" value="true" />
</bean>
<!-- Session Factory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="au.com.sharleepark.domain" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.hbm2ddl.auto">validate</prop>
<prop key="show_sql">true</prop>
</props>
</property>
</bean>
<!-- Data Access Objects -->
<!-- <bean id="hibernateDAO" class="au.com.sharleepark.hibernate.HibernateDaoImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean> -->
<!-- Transaction management -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- Spring exception translation post processor for the DAO layer -->
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
</beans>
adminLogin.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<div id="login">
<div id="loginContent">
<div class="error">${error}</div>
<form name='sharleeParkLoginForm' action="<c:url value='j_spring_security_check' />" method='POST'>
<fieldset>
<ul class="fieldUL">
<li>
<label class="inputLabel" for="j_username">Username</label>
<span>
<input class="inputField" type="text" tabindex="1" id="j_username" name="j_username" size="25" maxlength="25">
</span>
</li>
</ul>
<ul class="fieldUL">
<li>
<label class="inputLabel" for="spPassword">Password</label>
<span>
<input class="inputField" type="password" tabindex="2" id="j_password" name="j_password" size="25" maxlength="25">
</span>
</li>
</ul>
<ul class="fieldUL">
<li><input name="submit" type="submit" value="Login"></li>
</ul>
</fieldset>
</form>
</div>
</div>
${error}
-
用户名
-
密码
tiles.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
"http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
<tiles-definitions>
<definition name="base.definition" template="/WEB-INF/jsp/layout.jsp">
<put-attribute name="title" value="" />
<put-attribute name="header" value="/WEB-INF/jsp/header.jsp" />
<put-attribute name="body" value="" />
</definition>
....
<!-- ADMIN PAGES -->
<definition name="admin/login" extends="base.definition">
<put-attribute name="title" value="Administration Login" />
<put-attribute name="body" value="/WEB-INF/jsp/admin/adminLogin.jsp" />
</definition>
....
</tiles-definitions>
....
....
我打赌您的安全配置有问题
为什么在http声明中使用use expressions=“true”?我看不出你用的是Spring EL表达式。。。尝试删除它并查看是否有更改。尝试使用
从有关http
auto-config
属性的文档中:
自动注册登录表单、基本身份验证、匿名身份验证、注销服务、RememberMe和ServletAPI集成。如果设置为“true”,则会添加所有这些功能(尽管您仍然可以通过提供相应的元素来自定义每个功能的配置)。如果未指定,则默认为“false”
通常,我们不在控制器中处理
/login
映射。Spring security处理登录身份验证并指向成功Url。您可以在spring-config.xml中指定登录页面的视图名称,如下所示
<mvc:view-controller path="/login" view-name="login"/>
但是,如果没有错误,那么视图应该是不同的。解决问题的方法是将
登录处理url=“/admin/j\u spring\u security\u check”
属性添加到
标记中。我以前没有使用过Spring Security,我想我只是假设过滤器会神奇地找到j_Spring\u Security\u check
,并进行相应的处理。如果j_-spring\u security\u check
来自应用程序的根URI(即/sharleepark/j_-spring\u security\u check),那么过滤器可能会选择它?我从未见过需要在我所阅读的任何教程中指定登录处理url
。再次感谢大家的投入。据我所知(并根据),您需要使用表达式来使用permitAll
和isAuthenticated()
?无论如何,我尝试删除use expressions
,得到了一个“java.lang.IllegalArgumentException:不支持的配置属性:[permitAll,isAuthenticated(),none]”,因此它必须是必需的。我所有的安全配置都已发布,因此如果它在配置中,则是上面的内容。您可以在此处看到permitAll和isAuthenticated()是内置表达式。。。无论如何,为了进行测试,请去掉use expressions=“true”并尝试使用access=“ROLE\u USER”,然后查看是否仍需要对使用内置表达式进行更改。我确实尝试过你的建议,无论是否使用use expression
IllegalArgumentExceptions都会被抛出,所以不幸的是,我不认为这是我应该提到的,我也尝试过auto config=“true”
。不幸的是,它并没有阻止我返回登录页面。谢谢,我想这会解决它,因为我确实认为这与控制器映射有关。我以前尝试过从图片中删除控制器,但我不知道您可以使用
,所以这次我添加了
,但仍然不起作用。我无法从安全处理中获得任何日志记录,因此我正在编写一个快速过滤器来添加一些日志记录,以便更好地了解正在发生的事情。希望这能让我们对形势有更多的了解。否决票?诚然,我对Spring Security非常陌生,但如果你打算否决投票,请发表评论,这样我和其他人都能从中受益。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<div id="login">
<div id="loginContent">
<div class="error">${error}</div>
<form name='sharleeParkLoginForm' action="<c:url value='j_spring_security_check' />" method='POST'>
<fieldset>
<ul class="fieldUL">
<li>
<label class="inputLabel" for="j_username">Username</label>
<span>
<input class="inputField" type="text" tabindex="1" id="j_username" name="j_username" size="25" maxlength="25">
</span>
</li>
</ul>
<ul class="fieldUL">
<li>
<label class="inputLabel" for="spPassword">Password</label>
<span>
<input class="inputField" type="password" tabindex="2" id="j_password" name="j_password" size="25" maxlength="25">
</span>
</li>
</ul>
<ul class="fieldUL">
<li><input name="submit" type="submit" value="Login"></li>
</ul>
</fieldset>
</form>
</div>
</div>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
"http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
<tiles-definitions>
<definition name="base.definition" template="/WEB-INF/jsp/layout.jsp">
<put-attribute name="title" value="" />
<put-attribute name="header" value="/WEB-INF/jsp/header.jsp" />
<put-attribute name="body" value="" />
</definition>
....
<!-- ADMIN PAGES -->
<definition name="admin/login" extends="base.definition">
<put-attribute name="title" value="Administration Login" />
<put-attribute name="body" value="/WEB-INF/jsp/admin/adminLogin.jsp" />
</definition>
....
</tiles-definitions>
<mvc:view-controller path="/login" view-name="login"/>
ModelAndView mav = new ModelAndView();
mav.setViewName("admin/login");