Java Spring安全问题-Web应用程序启动时没有错误,但行为不稳定
我的SpringSecurityXWL配置不正确,我想知道它是什么。打开网站后,可以按预期访问页面/。如预期的那样,正在尝试访问/user/redirect to/login等。但是,不正确的登录信息会导致成功,用户会被定向到/user/files的页面内容。奇怪的是,url仍然是/login。此外,任何试图转到另一个/user/*页面的行为都会导致重定向到登录页面 但是,是的,我无法解决我的生活问题,任何帮助都是感激的。我将包括我的web应用程序的所有相关部分,以防它不是我的spring-security.xml文件 以下是my web.xml的相关部分:Java Spring安全问题-Web应用程序启动时没有错误,但行为不稳定,java,spring,security,spring-mvc,spring-security,Java,Spring,Security,Spring Mvc,Spring Security,我的SpringSecurityXWL配置不正确,我想知道它是什么。打开网站后,可以按预期访问页面/。如预期的那样,正在尝试访问/user/redirect to/login等。但是,不正确的登录信息会导致成功,用户会被定向到/user/files的页面内容。奇怪的是,url仍然是/login。此外,任何试图转到另一个/user/*页面的行为都会导致重定向到登录页面 但是,是的,我无法解决我的生活问题,任何帮助都是感激的。我将包括我的web应用程序的所有相关部分,以防它不是我的spring-se
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring-security.xml
/WEB-INF/spring-servlet.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<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>/user/*</url-pattern>
</filter-mapping>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
以下是返回用户的DAO逻辑:
UserDetails userDetails;
Collection<SimpleGrantedAuthority> authorities = new ArrayList<SimpleGrantedAuthority>();
if (dbUser != null){
authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
userDetails = new User(dbUser.getEmail(), dbUser.getPassword(), authorities);
} else {
userDetails = new User(null, null, authorities);
}
return userDetails;
最后,这里是login.jsp
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org"
th:include="components/layout :: loggedout">
<div th:fragment="content">
<div class="col-lg-4 col-md-4 col-sm-3 col-xs-2"></div>
<div class="col-lg-4 col-md-4 col-sm-6 col-xs-8">
<form name="f" th:action="@{/login}" method="post">
<fieldset>
<legend>
<h2 class="form-signin-heading">log in</h2>
</legend>
<div th:if="${param.error}" class="alert alert-error text-center">
Invalid username or password.
</div>
<div th:if="${param.logout}" class="alert alert-success text-center">
You have been logged out.
</div>
<label for="username" class="sr-only">email address</label>
<input name="username" type="email" class="form-control" placeholder="email address" required="true" autofocus="true" />
<label for="password" class="sr-only">password</label>
<input name="password" type="password" class="form-control" placeholder="password" required="true" />
<div class="checkbox">
<label>
<input type="checkbox" value="remember-me"> remember me </input>
</label>
</div>
<div class="form-actions">
<button class="btn btn-lg btn-primary btn-block">log in</button>
</div>
</fieldset>
</form>
</div>
<div class="col-lg-4 col-md-4 col-sm-3 col-xs-2"></div>
</div>
</html>
登录
无效的用户名或密码。
您已注销。
电子邮件地址
暗语
记得我吗
登录
非常感谢您提供的任何帮助,如果您有任何问题,请询问。幸运的是,这些评论为我指明了正确的方向-这实际上是两个不同的问题同时出现
post操作由我的登录控制器处理,而不是spring security。因此,我删除了post方法。此外,post没有被正确调用或传递正确的参数-因此我将操作更改为th:action=“@{/j_-spring_-security_-check}”,并将输入更改为j_-username和j_-password。谢谢@PatrickLC和@M.Deinum。您可以尝试将web.xml中的springSecurityFilterChain从/user/*更改为/*并在登录表单中使用th:action=“@{/j_-spring_-security_-check}”和j_-username和j_-password的输入将
LoginController
spring-security为您处理。您只保护了/user/*
其他所有内容都不受保护。*
表示单个级别,而***
表示0或更多级别。因此,我怀疑这两件事对保护您的应用程序没有帮助。最后,您的dao也是错误的,如果没有找到任何用户,它应该按照契约的定义返回NULL,但是您正在返回一个用户。@M.Deinum I仔细检查契约-它永远不应该返回NULL。但是,它应该抛出UserNotFoundException,这是我的设置中的另一个问题。谢谢你朝正确的方向努力。你是对的,我错了。
UserDetails userDetails;
Collection<SimpleGrantedAuthority> authorities = new ArrayList<SimpleGrantedAuthority>();
if (dbUser != null){
authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
userDetails = new User(dbUser.getEmail(), dbUser.getPassword(), authorities);
} else {
userDetails = new User(null, null, authorities);
}
return userDetails;
@Controller
@RequestMapping(value="/login")
public class LoginController {
TitanController titan = TitanController.getInstance();
@RequestMapping(method=RequestMethod.GET)
public String getLogin(Model model) {
return "login";
}
@RequestMapping(method=RequestMethod.POST)
public String postLogin(){
return "files";
}
}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org"
th:include="components/layout :: loggedout">
<div th:fragment="content">
<div class="col-lg-4 col-md-4 col-sm-3 col-xs-2"></div>
<div class="col-lg-4 col-md-4 col-sm-6 col-xs-8">
<form name="f" th:action="@{/login}" method="post">
<fieldset>
<legend>
<h2 class="form-signin-heading">log in</h2>
</legend>
<div th:if="${param.error}" class="alert alert-error text-center">
Invalid username or password.
</div>
<div th:if="${param.logout}" class="alert alert-success text-center">
You have been logged out.
</div>
<label for="username" class="sr-only">email address</label>
<input name="username" type="email" class="form-control" placeholder="email address" required="true" autofocus="true" />
<label for="password" class="sr-only">password</label>
<input name="password" type="password" class="form-control" placeholder="password" required="true" />
<div class="checkbox">
<label>
<input type="checkbox" value="remember-me"> remember me </input>
</label>
</div>
<div class="form-actions">
<button class="btn btn-lg btn-primary btn-block">log in</button>
</div>
</fieldset>
</form>
</div>
<div class="col-lg-4 col-md-4 col-sm-3 col-xs-2"></div>
</div>
</html>