Spring 安全初始化失败

Posted

技术标签:

【中文标题】Spring 安全初始化失败【英文标题】:Spring security initialization failed 【发布时间】:2018-06-10 01:55:33 【问题描述】:

我正在尝试使用 Spring Security 实现一个简单的登录(我是 Spring Security 的新手)。我从 Spring Security 参考开始,其中包含一个简单的“Hello world”示例 (link)。我在 Eclipse 中准备了一个 web 项目(带有 EAR 项目),文件结构如下所示:

SecurityConfigSecurityWebApplicationInitializer 类与上面链接中的类相同(“Hello world”示例)。我还添加了 Log4j 2 配置文件和主页(login.xhtml),(现在)只打印“test”。稍后它将用作自定义登录页面。

web.xml 只包含一个welcome-file 元素:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>SpringSecurity</display-name>
    <welcome-file-list>
        <welcome-file>pages/login.xhtml</welcome-file>
    </welcome-file-list>
</web-app>

EAR 的部署程序集如下所示:

我在JBoss AS 7.1.1上部署EAR时没有报错,但是当我访问http://localhost:8080/SpringSecurity时,我的主页正常显示。

我猜上面的配置应该会生成一个默认的登录页面。当我访问我的主页时,应该会出现该登录页面,对吗?看起来 Spring Security 甚至没有加载,访问我的主页时也没有保护。

我真的不明白为什么这个简单的例子不起作用。有什么帮助吗?

【问题讨论】:

@dur 我已经在SecurityConfig 中添加了一些日志记录。没有任何记录,也没有达到断点。所以看起来配置甚至没有加载 - 不知道为什么。 @dur 不,不是,我已经检查过了。 @dur 是的,JBoss 7 支持 Java Servlet 3.1。还尝试在 Tomcat 8.5 (Java Servlet 3.1) 上进行 WAR 部署 - 不走运。 我认为您缺少 configure(HttpSecurity http) :请参阅mkyong.com/spring-security/… 我认为,您的 spring jar 不适用于(在类路径中)您的战争。只需检查并确认“ear-subdeployments-isolated”属性设置为“false”。参考 - docs.jboss.org/author/display/AS7/Class+Loading+in+AS7 【参考方案1】:

我的机器上目前没有 JBoss。但我能够在 tomcat 上部署这个示例。

问题当然是战争类加载器无法在运行时看到弹簧罐。

有两种可能的解决方案来解决这个问题。

    如果 spring jar 仅由 war 模块(而不是 ear 中的任何其他模块)需要,那么您可以将这些 spring jar 从 ear 的 lib 目录转移到 war 的 WEB-INF/lib 目录。

    如果其他模块也需要 spring jar,则您可以在 war 的 MANIFEST.MF 文件中显式设置 Class-Path 条目,以及以可移植方式需要这些 jar 的其他模块。

例如

Manifest-Version: 1.0 
Class-Path: lib/spring-beans-4.3.9.RELEASE.jar lib/spring-context-4.3.9.RELEASE.jar

以这种方式添加所有需要的 jar,以 sapce (' ') 分隔。

注意:-我使用以下 jar 来运行此示例。

spring-aop-5.0.2.RELEASE.jar
spring-beans-5.0.2.RELEASE.jar
spring-context-5.0.2.RELEASE.jar
spring-core-5.0.2.RELEASE.jar
spring-expression-5.0.2.RELEASE.jar
spring-jcl-5.0.2.RELEASE.jar
spring-security-config-5.0.0.RELEASE.jar
spring-security-core-5.0.0.RELEASE.jar
spring-security-crypto-5.0.0.RELEASE.jar
spring-security-web-5.0.0.RELEASE.jar
spring-web-5.0.2.RELEASE.jar

使用此版本的 spring 和 spring-security,您可能需要对代码进行一些小改动。

User.withDefaultPasswordEncoder().username("user").password("user").roles("USER").build(); 

User.withUsername("user").password("noopuser").roles("USER").build();

有关所需代码更改的更多详细信息,请参阅 - Spring Boot PasswordEncoder Error。

【讨论】:

谢谢,我在 Tomcat 8.5 上尝试了解决方案 1,它成功了!这对我来说似乎很奇怪,因为我在控制台中没有收到任何错误,一切看起来都很好,但你是对的。现在我也应该设法在 JBoss 上部署示例。再次感谢!

以上是关于Spring 安全初始化失败的主要内容,如果未能解决你的问题,请参考以下文章

上下文初始化失败 Spring

org.hibernate.LazyInitializationException:懒惰初始化角色集合失败(Hibernate + Spring)

电脑开机后出现初始化失败是怎么回事 带你深入了解原因所在

上下文初始化失败Spring Maven

电脑初始化失败怎么办

spring:即使在很好地定义了类路径之后,上下文初始化也失败了