无法在 Spring Security 中用自定义替换标准登录表单
Posted
技术标签:
【中文标题】无法在 Spring Security 中用自定义替换标准登录表单【英文标题】:Cannot replace standard login form with custom in Spring Security 【发布时间】:2015-06-12 12:06:47 【问题描述】:当我要访问 localhost/SpringMVC/login 时,服务器会将我指向默认登录页面,而不是我创建的页面。 Security.xml 似乎被正确包含,因为工作正常。我正在使用 Spring Security 4.0.0 这是我的安全配置:
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/admin" access="hasRole('ROLE_ADMIN')" />
<intercept-url pattern="/forRegisteredUsersOnly" access="hasRole('ROLE_USER')" />
<form-login
login-page='/login'
authentication-failure-url="/login?error=true"
login-processing-url="/j_spring_security_check" />
<logout logout-success-url="/" logout-url="/j_spring_security_logout" />
</http>
web.xml:
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/webapp-servlet.xml
/WEB-INF/webapp-security.xml
</param-value>
</context-param>
<servlet>
<servlet-name>webapp</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>webapp</servlet-name>
<url-pattern>/</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>
登录控制器.java:
@Controller
public class LoginController
@RequestMapping(value = "/login", method = RequestMethod.GET)
public ModelAndView getLoginForm(@RequestParam(required=false) String authFailed, String logout)
String message="";
if(authFailed != null)
message = "Invalid username or password, try again !";
else if (logout != null)
message = "Logged Out successfully, login again to continue!";
return new ModelAndView("login", "message", message);
ViewResolver 然后将“登录”映射到 /WEB-INF/views/login.jsp(映射在其他页面上工作正常)
更新: 我不知道为什么,但我的登录表单可以在 localhost/SpringMVC/login.html 找到。如何将其更改为 localhost/SpringMVC/login ?
【问题讨论】:
【参考方案1】:使用双引号作为登录页面的值并尝试添加 default-target-url 。
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/admin" access="hasRole('ROLE_ADMIN')" />
<intercept-url pattern="/forRegisteredUsersOnly" access="hasRole('ROLE_USER')" />
<form-login
login-page="/login"
default-target-url="/home"
authentication-failure-url="/login?error=true"
login-processing-url="/j_spring_security_check" />
<logout logout-success-url="/" logout-url="/j_spring_security_logout" />
</http>
【讨论】:
以上是关于无法在 Spring Security 中用自定义替换标准登录表单的主要内容,如果未能解决你的问题,请参考以下文章
Spring Security - 无法将默认登录页面更改为自定义
无法在 Spring Boot Security 中登录到我的自定义登录页面
无法为 Spring Security 提供自定义身份验证提供程序
spring security 无法添加自定义身份验证提供程序
无法使用带有自定义 UserDetail 和 AuthenticationProvider 的 Spring Security 来阻止用户多次登录