为什么' permitAll()'不工作?

时间:2015-10-19 17:42:04

标签: xml gwt spring-security

值得一提:我正在关注Securing GWT apps with Spring Security的教程。

我不明白。我似乎无法让public class LabSeven { private static final int PLAYERS_NUM = 3; public static void main(String[] args) { Scanner input = new Scanner(System.in); String[] playerName = new String[PLAYERS_NUM]; double[] dollarSalary = new double[PLAYERS_NUM]; double totalSalary = 0; for (int i = 0; i < PLAYERS_NUM; i++) { System.out.print("Enter player name: "); playerName[i] = input.next(); System.out.print("Enter Salary: "); double salary = input.nextDouble(); dollarSalary[i] = salary; totalSalary += salary; } System.out.printf("Total payroll amount is: %7.2f\n", totalSalary); for (int i = 0; i < PLAYERS_NUM; i++) { System.out.printf(" %s %7.2f\n", playerName[i], dollarSalary[i]); } input.close(); } } 工作,因为我需要它。

这是我目前的配置:

permitAll

如果我在<http auto-config="true"> <intercept-url pattern="/**" access="permitAll" /> <form-login login-page="/login" default-target-url="/welcome" authentication-failure-url="/login?error" username-parameter="username" password-parameter="password" /> </http> 访问我的网站,则网站未完全加载,因为请求

//localhost:8080
由于某种原因,

//localhost:8080/app/xsrf 。如果我理解正确的话,我配置Spring Security的方式应该不是问题。

如果我只是添加

,我不会工作
403 Forbidden

<intercept-url pattern="/**" access="permitAll" /> 的工作正在添加:

<http ..>

我想理解为什么,因为这不是我要配置Spring Security的方式..添加应该允许的每个URL。

我面临的附加问题是,无论出于何种原因(可能相同),我都无法访问<http pattern="/app/xsrf" security="none"/> 。这意味着如果我将登录信息提交至//localhost:8080/login,我将收到/login

现在,人们会认为添加403 Forbidden会对此有所帮助,但没有。如果我将其添加到我的配置中,我将在此特定URL上获得<http pattern="/login" security="none"/>

这开始让我疯了,因为我被困在这里这么多天我都不敢告诉你。你的帮助将得到赞赏和奖励。

整个 applicationContext-service.xml

404 Not Found

修改

缩减了applicationContext-service.xml

<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"
    xmlns:security="http://www.springframework.org/schema/security"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
    http://www.springframework.org/schema/security 
    http://www.springframework.org/schema/security/spring-security-4.0.xsd">

    <!-- Imports -->
    <beans:import resource="applicationContext-jooq.xml"/>

    <!-- /////////////////////////////////////////////////////////////// -->
    <!-- // BEGIN Spring Security -->

    <http pattern="/app/xsrf" security="none"/>
    <!-- <http pattern="/login" security="none"/> -->

    <http auto-config="true">
        <intercept-url pattern="/**" access="permitAll" />

        <form-login 
            login-page="/login" 
            default-target-url="/welcome" 
            authentication-failure-url="/login?error" 
            username-parameter="username"
            password-parameter="password" />
    </http>

    <beans:bean id="authenticationListener" 
            class="com.mz.server.web.auth.CustomAuthenticationListener"/>

    <beans:bean id="authenticationProvider" 
            class="com.mz.server.web.auth.CustomAuthenticationProvider"/>

    <beans:bean id="userDetailsService" 
            class="com.mz.server.web.service.CustomUserDetailsService"/>

    <authentication-manager alias="authenticationManager">
        <authentication-provider ref="authenticationProvider"/>
    </authentication-manager>

    <!-- // END Spring Security -->
    <!-- /////////////////////////////////////////////////////////////// -->
    <!-- // BEGIN Services -->

    <beans:bean id="loginService" class="com.mz.server.web.service.LoginService">
        <beans:constructor-arg ref="dslContext" />
    </beans:bean>

    <!-- // END Services -->

</beans:beans>

这是 web.xml

<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-4.1.xsd
    http://www.springframework.org/schema/security 
    http://www.springframework.org/schema/security/spring-security-4.0.xsd">

    <!-- Imports -->
    <beans:import resource="applicationContext-jooq.xml"/>

    <!-- //////////////////////////////////////////////////////////////////////////////// -->
    <!-- // BEGIN Spring Security -->

    <global-method-security pre-post-annotations="enabled"/>

    <http auto-config="true">
        <intercept-url pattern="/**" access="permitAll" />
    </http>

    <!-- // END Spring Security-->

</beans:beans>

1 个答案:

答案 0 :(得分:0)

修改 由于use-expressions=true默认启用,所以这个答案没有帮助。 但是......我发现了你的错误:
spring会自动在/ login生成默认登录页面,但前提是您没有指定任何login-page参数。您将参数设置为/login,期望您将被重定向到此默认页面。 这就是为什么你得到404未找到的错误 所以删除login-page="/login"以使用默认值或创建自己的登录页面 authentication-failure-url="/login?error"相同:使用默认页面时将其删除 默认登录页面中的username-和password-parameter是&#34; j_username&#34;和&#34; j_password&#34;而春天也找不到这些。如果你不使用自己的登录页面,请删除它们。
你也为安全性添加了xml命名空间两次......你应该删除xmlns:security="http://www.springframework.org/schema/security"

仅适用于spring security 3.x
如果您想使用permitAll这样的表达式,则需要使用use-expressions="true"启用它们。 别忘了允许访问您的登录页面所需的资源。 here你可以找到一些使用表达式的帮助。 我的问题是,如果您使用单独的login.jsp / html页面或&#34; / login&#34;是指您的gwt应用中的地点/历史记录?

它如何运作的一个小例子:

<http auto-config="true" use-expressions="true">
    <intercept-url pattern="/login" access="permitAll" />
    <intercept-url pattern="/resources/**" access="permitAll" />
    <intercept-url pattern="/**" access="isFullyAuthenticated()" />
    <!-- if you are not completely familiar how to use expressions -->
    <!-- then using this will probably easier: -->
    <!-- <http auto-config="true" use-expressions="false">
        <!-- <intercept-url pattern="/login" access="IS_AUTHENTICATED_ANONYMOUSLY" /> -->
        <!-- <intercept-url pattern="/resources/**" access="IS_AUTHENTICATED_ANONYMOUSLY" /> -->
        <!-- <intercept-url pattern="/**" access="IS_AUTHENTICATED_FULLY" /> -->

    <!-- why not your /index.html/jsp?? -->
    <form-login 
        default-target-url="/welcome" 
        always-use-default-target="true"/>
</http>