当前位置: 首页 > 知识库问答 >
问题:

成功进行Spring Security认证后,未找到HTTP 404

阎承嗣
2023-03-14

我正在尝试使用数据库实现Spring Security身份验证和授权。Spring安全认证工作良好。但是我得到的是HTTP 404 NOT FOUND页面,URL /Sample_App/j_spring_security_check,而不是默认目标URL,它应该去。

这是我的Spring安全档案

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

    <beans:import resource="im-jndi-datasource.xml" />

    <http pattern="/inventory/auth/login" security="none"/>
    <http pattern="/inventory/auth/deny" security="none"/>
    <http pattern="/images/**" security="none"/>
    <http pattern="/css/**" security="none"/>
    <http pattern="/js/**" security="none"/>

    <http auto-config="true">

        <intercept-url pattern="/inventory/**" access="ROLE_ADMIN" />   

        <form-login 
            login-page="/inventory/auth/login" 
            default-target-url="/inventory/landing/loadDashBoardPage"
            authentication-failure-url="/inventory/auth/login?error"
            username-parameter="username" 
            password-parameter="password" />

        <access-denied-handler error-page="/inventory/auth/deny"/>  

        <logout logout-success-url="/logout" />

        <session-management
            session-authentication-error-url="/inventory/auth/login" 
            invalid-session-url="/inventory/auth/login">
            <concurrency-control max-sessions="1" error-if-maximum-exce    eded="true"/>
        </session-management>

    </http>

    <authentication-manager>
        <authentication-provider>
        <!-- <security:user-service> <security:user name="dineshonjava" password="sweety" 
                authorities="ROLE_USER" /> </security:user-service> -->
            <jdbc-user-service data-source-ref="dataSource"
            users-by-username-query="select username, password, status as enabled from bbp_user where username=?"
            authorities-by-username-query="select us.username, ur.rolename as authority from bbp_user us, bbp_users_and_roles bur, bbp_role ur     
    where us.user_id = bur.user_id and bur.role_id =ur.role_id  and us.username =? " />
        </authentication-provider>
    </authentication-manager>

</beans:beans>

这是spring-servlet.xml文件的一部分

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/eimsgo-security.xml</param-value>
    </context-param>

    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>WEB-INF/spring-servlet.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/inventory/*</url-pattern>
    </servlet-mapping>

<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>

我使用磁贴2。磁贴查看解决方案和内容讨论查看解决方案

这是我的瓷砖-上下文xml

<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
    <property name="definitions">
        <list>
            <value>/WEB-INF/views.xml</value>
        </list>
    </property>
</bean> 

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
      <property name="mediaTypes">
        <map>
          <entry key="atom" value="application/atom+xml"/>
          <entry key="html" value="text/html"/>
          <entry key="json" value="application/json"/>
        </map>
      </property>        
      <property name="defaultViews">
        <list>
          <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
        </list>
      </property>
</bean>

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix">
      <value>/jsp/</value> 
    </property>
    <property name="suffix">
      <value>.jsp</value> 
    </property>
</bean> 

这是我的欢迎文件索引。jsp点击LoginController。带有URL的java(/inventory/auth/login)

登录控制器.java

@Controller
@RequestMapping("/auth")
public class LoginController {  
@RequestMapping(value = "/login", method = RequestMethod.GET)
public ModelAndView login(@RequestParam(value = "error", required = false) String error,
        @RequestParam(value = "logout", required = false) String logout,
        @RequestParam(value = "invalid", required = false) String invalid) {

    ModelAndView model = new ModelAndView();
    if (error != null) {
        model.addObject("error", "Invalid username and password!");
    }

    if (logout != null) {
        model.addObject("msg", "You've been logged out successfully.");
    }
    if(invalid != null) {
        model.addObject("invalid", "Invalid session!!");
    }
    model.setViewName("home_creation");

    return model;
}

}

成功登录后,应根据安全xml文件中定义的默认目标url转到/inventory/landing/loadDashBoardPage。

其中/landing是我的一个Spring控制器,loadDashBoarPage是方法级映射。loadDashBoardPage与数据库交互,设置地图对象并返回视图字符串“DashBoardPage”。TilesViewResolver现在应该呈现此页面。

InventoryController.java

@Controller
@RequestMapping("/landing")
public class InventoryController {

@RequestMapping(value = { "/loadDashBoardPage" }, method = { GET, POST })
public String loadDashBoardPage(Map<String, Object> model,
        HttpServletRequest request, HttpSession session) {
    List lobList = new ArrayList();
    InventoryService inventoryService = (InventoryService) InventoryApplicationContext
            .getBean("inventoryService");
    lobList = inventoryService.loadLob();
    model.put("lob", lobList);
    model.put("leftTreee", inventoryService.loadDataforNavigator());
    return "DashBoardPage";
}

请在下面找到日志

2014-12-05 22:55:27419[http-bio-8090-exec-8]调试org.springframework.jdbc.datasource。DataSourceTransactionManager-启动事务提交

2014-12-05 22:55:27420[http-bio-8090-exec-8]调试org.springframework.jdbc.datasource。DataSourceTransactionManager-在连接上提交JDBC事务[JDBC:oracle:thin:@10.237.31.14:1521:xe,用户名=ADMIN,oracle JDBC驱动程序]

2014-12-05 22:55:27,422 [http-bio-8090-exec-8] DEBUG org.springframework.jdbc.datasource.DataSourceTransactionManager - Release JDBC Connection [jdbc:oracle:thin:@10.237.31.14:1521:xe, UserName=ADMIN, Oracle JDBC driver] after事务

2014-12-05 22:55:27,422[超文本传输协议-bio-8090-exec-8]DEBUGorg.springframework.jdbc.datasource.DataSourceUtils-将JDBC连接返回到DataSource

2014-12-05 22:55:27425[http-bio-8090-exec-8]调试org.springframework.web.servlet.view。ContentNegotiatingViewResolver-请求的媒体类型为[image/jpeg、application/x-ms-application、image/gif、application/xaml xml、image/pjpeg、application/x-ms-xbap、application/vnd.ms-excel、application/vnd.ms-powerpoint、application/msword、/](基于Accept标头)

2014-12-05 22:55:27,425 [http-bio-8090-exec-8] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - 在名为'DashBoardPage.atom'的bean上调用afterPropertiesSet()

2014-12-05 22:55:27,426[超文本传输协议-bio-8090-exec-8]DEBUGorg.springframework.beans.factory.support.DefaultListableBeanFactory-调用名为'DashBoardPage.json'的bean上的属性集()

2014-12-05 22:55:27,429[超文本传输协议-bio-8090-exec-8]DEBUGorg.springframework.beans.factory.support.DefaultListableBeanFactory-在名为'DashBoardPage.html'的bean上调用()

2014-12-05 22:55:27430[http-bio-8090-exec-8]DEBUG org . spring framework . web . servlet . view . contentnegotiangviewrolver-Returning[org . spring framework . web . servlet . view . tiles 2 . tiles view:name ' dashboard page ';基于请求的媒体类型“/”的URL [DashBoardPage]]

2014-12-05 22:55:27430[http-bio-8090-exec-8]调试org.springframework.web.servlet。DispatcherServlet-呈现视图[org.springframework.web.servlet.view.tiles2.TilesView:名称为“DashBoardPage”;名称为“spring”的DispatchersServlet中的URL[Dashboard Page]]

2014-12-05 22:55:27430[http-bio-8090-exec-8]调试org.springframework.web.servlet.view.tiles2.TilesView-添加了类型为[java.util.ArrayList]的模型对象“lob”,以请求名为“DashBoardPage”的视图

2014-12-05 22:55:27431[http-bio-8090-exec-8]调试org.springframework.web.servlet.view.tiles2.TilesView-添加了类型为[java.util.HashMap]的模型对象“leftTreee”,以请求名为“DashBoardPage”的视图

2014-12-05 22:55:27,431 [http-bio-8090-exec-8] DEBUG org.apache.tiles.impl.BasicTilesContainer - Render 请求已收到定义“DashBoardPage”

2014-12-05 22:55:27,432[超文本传输协议-bio-8090-exec-8]DEBUGorg.springframework.web.servlet.DispatcherServlet-成功完成请求

2014-12-05 22:55:27432[http-bio-8090-exec-8]调试org.springframework.security.web.access。ExceptionTranslationFilter-链正常处理

2014-12-05 22:55:27,432[超文本传输协议-bio-8090-exec-8]DEBUGorg.springframework.security.web.context.SecurityContextPersistenceFilter-SecurityContextHolder现在已清除,因为请求处理已完成

Spring Security在此处成功进行身份验证,并且视图解析器未呈现请求的页面。

相反我http://abc.xyz.com/Sample_App/j_spring_security_check

它应该允许用户转到默认目标URL中定义的URL

/Sample_App/inventory/landing/loadDashBoardPage

请告知!!

共有1个答案

朱天逸
2023-03-14

我自己解决了这个问题。Spring Security紧密地拦截所有的URL,包括CSS、图像、JavaScripts、JSP文件等等。

这里的问题是,我使用的是TilesViewResolver

<definition name="LogoutPage" template="/jsp/logout.jsp"> 
    <put-attribute name="header" value="/jsp/tiles/logoutHeader.jsp" />
    <put-attribute name="footer" value="/jsp/tiles/footer.jsp" />
    <put-attribute name="content" value="/jsp/logout_creation.jsp" />
</definition>   

我忘记配置Spring Security性,它拦截这些tiles页面使用的所有子URL,并基于角色进行身份验证。

 类似资料:
  • 本文首次展示了SAML认证的过程:https://developers.google.com/google-apps/sso/saml_reference_implementation 我的应用程序目前与之兼容。但是,当用户单击SP提供的页面上的链接时,请求被重定向到IDP进行身份验证。用户可以在地址栏中清楚地看到IDP URL,感觉很慢。 我的情况:SP位于Jetty上,IDP位于Jboss6.

  • 问题内容: 我已经在我的应用程序中实现了spring-security,而spring-security.xml具有以下form-login标签。 我想从/login.htm登录,成功认证后,我希望用户点击dashboard.htm。Everythig正常运行,除了在成功认证之后它不会命中/dashboard.htm而是命中上下文..但是,如果我在url中手动键入dashboard.htm,那么一

  • 在过去的几天里,我使用GSS-API和SPNEGO构建了一个概念验证演示。目的是让用户通过Http RESTful Web服务单点登录访问我们的自定义应用程序服务器提供的服务。 持有有效Kerberos票证授予票证(TGT)的用户可以调用启用SPNEGO的Web服务,客户端和服务器将进行协商,用户将通过Kerberos和应用程序级别进行身份验证,并且(在成功身份验证后)在其票证缓存中拥有我的服务主

  • 我下载了最新版本的spring工具套件(STS 3.6.2),当我尝试导入spring入门内容时,返回如下错误: 入门指南SunCertPathBuilderException:找不到请求目标的有效证书路径 我已经设置了访问internet的代理,但我不知道如何在STS中导入证书。请帮忙。谢谢 詹姆斯

  • 在WAR的情况下,它试图将请求转发到/error页面,并寻找它的处理程序方法(请参见底部的日志)。 最后我得到以下回应: 我该换什么才能得到401?

  • 我想建立小型应用程序。会有一些用户。我不想做自己的用户系统。我想将我的应用程序与oauth/oauth2.0集成。 集成我的前端应用程序和oauth 2.0没有问题。有很多有用的文章,如何做到这一点,即使在 stackoverflow.com 上。例如,这篇文章非常有帮助。 但是。在前端成功授权后,我该怎么办?当然,我可以在客户端上有标志,上面写着“好的,伙计,用户已通过身份验证”,但是我现在应该