Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 春季安全3.1_Java_Spring Mvc_Spring Security - Fatal编程技术网

Java 春季安全3.1

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

当我尝试使用带有Spring Security的自定义登录表单时,无论我输入的凭据是否正确,它都会不断将我返回到/admin/login页面。当我使用空的
时,安全检查工作正常。但是一旦我添加了一个自定义的
,我就会返回到同一个页面。我已尝试添加
默认目标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");