Java 使用spring boot starter security中的自定义登录页成功登录,无法进入下一页
我一直在学习春靴。在为todo应用程序使用spring boot starter安全性时,我尝试使用自定义用户id和密码以及自定义登录页面登录。当我尝试登录时,它不会将我带到下一页。注意:用户名是下一页的必需参数 我尝试使用下面的,但登录后,它再次把我作为错误登录页面Java 使用spring boot starter security中的自定义登录页成功登录,无法进入下一页,java,spring,spring-boot,Java,Spring,Spring Boot,我一直在学习春靴。在为todo应用程序使用spring boot starter安全性时,我尝试使用自定义用户id和密码以及自定义登录页面登录。当我尝试登录时,它不会将我带到下一页。注意:用户名是下一页的必需参数 我尝试使用下面的,但登录后,它再次把我作为错误登录页面 @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().antMa
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/login").permitAll()
.antMatchers("/", "/*Todo*/**").access("hasRole('USER')").and()
.formLogin().loginPage("/login").permitAll();
}
这是我的securityConfig代码
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/login").permitAll()
.antMatchers("/listTodo").hasAnyRole("USER","ADMIN")
.anyRequest().authenticated()
.and().formLogin().loginPage("/login").permitAll().and()
.logout().permitAll();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("Sudhakar").password("qwe123").roles("USER","ADMIN");
}
}
I would need to login with user name and get the todo details of the user who logged in. But I am not able to get to next page, after trying many times I am getting below error
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
Below is my controller
package com.example.SpringLogin.Controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.SessionAttributes;
import com.example.SpringLogin.service.loginService;
@Controller
@SessionAttributes("name")
public class LoginController {
@Autowired
loginService service;
@RequestMapping(value="/login",method = RequestMethod.POST)
public String loginMessage(ModelMap model,@RequestParam String name,@RequestParam String password) {
boolean isValidUser=service.validateUser(name, password);
if(!isValidUser) {
model.put("message", "Invalid Credentials");
return"Room";
}
model.put("name", name);
model.put("password",password);
return "redirect:/todoList";
}
@RequestMapping(value="/login",method = RequestMethod.GET)
public String roomLogin(ModelMap model, String error) {
//model.put("name", name);
if(error!=null) {
model.addAttribute("errorMsg","UserName or Password is invalid");
}
return "Room";
}
/*@RequestMapping(value="/login",method = RequestMethod.GET)
public String showLogin(ModelMap model) {
//model.put("name", name);
return "Welcome";
}*/
@RequestMapping(value = "/welcome")
public String showWelcome(ModelMap model) {
return "login";
}
}
My login page
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<c:set var="contextPath" value=""/>
<!DOCTYPE html>
<html>
<head>
<link href="webjars/bootstrap/3.3.6/css/bootstrap.min.css"
rel="stylesheet">
<title>Todo Application</title>
</head>
<body>
<div class="container">
<font color="red">${message}</font>
<form:form method="post" action="/login">
<fieldset class="form-group">
Name : <input type="text" name="username" class="form-control" placeholder="Username"
autofocus="true"/>
Password: <input type="password" name="password"
class="form-control" placeholder="Password" />
</fieldset>
<button type="submit" class="btn btn-success">Submit</button>
</form:form>
</div>
<script src="webjars/jquery/1.9.1/jquery.min.js"></script>
<script src="webjars/bootstrap/3.3.6/js/bootstrap.min.js"></script>
</body>
</html>
After successful login it should go to below page
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<c:set var="contextPath" value=""/>
<!DOCTYPE html>
<html>
<head>
<link href="webjars/bootstrap/3.3.6/css/bootstrap.min.css"
rel="stylesheet">
<title>Todo Application</title>
</head>
<body>
<div class="container">
<table class="table table-striped">
<H1>Name : ${pageContext.request.userPrincipal.name}</H1>
<thead>
<tr>
<th>Id</th>
<th>Course</th>
<th>End Date</th>
<th>Is it Done</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<c:forEach items="${todo}" var="item">
<tr>
<td>${item.id}</td>
<td>${item.course}</td>
<td><fmt:formatDate value="${item.date}" pattern="MM/dd/yyyy" /></td>
<td>${item.isdone?'Yes':'No'}</td>
<td><a type="button" class="btn btn-success"
href="/update-Todo?id=${item.id}">Update</a></td>
<td><a type="button" class="btn btn-warning"
href="/delete-Todo?id=${item.id}">Delete</a></td>
</tr>
</c:forEach>
</tbody>
</table>
<div>
<a type="button" href="/add-Todo" class="btn btn-success">Add a
Todo</a>
</div>
</div>
<script src="webjars/jquery/1.9.1/jquery.min.js"></script>
<script src="webjars/bootstrap/3.3.6/js/bootstrap.min.js"></script>
</body>
</html>
Service class
package com.example.SpringLogin.service;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.springframework.stereotype.Service;
import com.example.SpringLogin.model.todoList;
@Service
public class TodoService {
public static List<todoList> todos=new ArrayList<todoList>();
public static int todoCount=5;
static {
todos.add(new todoList(1, "Sudhakar", "Study history", new Date(), false));
todos.add(new todoList(2,"Sudhakar","Study geography",new Date(),false));
todos.add(new todoList(3,"Sudhakar","Study GK",new Date(),false));
todos.add(new todoList(4,"Mani","Study Java",new Date(),false));
todos.add(new todoList(5,"Mani","Study script",new Date(),false));
}
public List<todoList> retrievetodos(String name){
List<todoList> retrieved=new ArrayList<todoList>();
for (todoList todo : todos) {
if(todo.getName().equalsIgnoreCase(name)) {
retrieved.add(todo);
}
}
return retrieved;
}
public void addTodo(String name,String Course,Date date,boolean isDone) {
todos.add(new todoList(++todoCount,name,Course,date,isDone));
}
public todoList retrieveTodo(int id){
for (todoList todo : todos) {
if(todo.getId()==id) {
return todo;
}
}
return null;
}
public List<todoList> UpdateTodo(todoList todo){
/*for (todoList td : todos) {
if(td.getId()==todo.getId()) {
td.setCourse(todo.getCourse());
td.setDate(todo.getDate());
}
}*/
todos.remove(todo);
todos.add(todo);
return todos;
}
//it will delete the todo
public void deleteTodo(int id) {
Iterator<todoList> it = todos.iterator();
while(it.hasNext()){
todoList td=it.next();
if(td.getId()==id) {
it.remove();
}
}
}
}
@配置
@启用Web安全性
公共类SecurityConfig扩展了WebSecurity配置适配器{
@凌驾
受保护的无效配置(HttpSecurity http)引发异常{
http.authorizeRequests().antMatchers(“/login”).permitAll()
.antMatchers(“/listTodo”).hasAnyRole(“用户”、“管理员”)
.anyRequest().authenticated()
.and().formLogin().login页面(“/login”).permitAll()和()
.logout().permitAll();
}
@自动连线
public void configureGlobal(AuthenticationManagerBuilder auth)引发异常{
auth.inMemoryAuthentication().withUser(“Sudhakar”).password(“qwe123”).roles(“USER”、“ADMIN”);
}
}
我需要使用用户名登录,并获取登录用户的todo详细信息。但我无法进入下一页,在尝试了很多次之后,我发现下面的错误
java.lang.IllegalArgumentException:没有为id“null”映射的PasswordEncoder
下面是我的控制器
包com.example.SpringLogin.Controller;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.stereotype.Controller;
导入org.springframework.ui.ModelMap;
导入org.springframework.web.bind.annotation.RequestMapping;
导入org.springframework.web.bind.annotation.RequestMethod;
导入org.springframework.web.bind.annotation.RequestParam;
导入org.springframework.web.bind.annotation.SessionAttributes;
导入com.example.SpringLogin.service.loginService;
@控制器
@会期贡献(“名称”)
公共类登录控制器{
@自动连线
后勤服务;
@RequestMapping(value=“/login”,method=RequestMethod.POST)
公共字符串登录消息(ModelMap模型、@RequestParam字符串名称、@RequestParam字符串密码){
布尔值isValidUser=service.validateUser(名称、密码);
如果(!isValidUser){
model.put(“消息”、“无效凭据”);
返回“房间”;
}
型号。放置(“名称”,名称);
型号。输入(“密码”,密码);
返回“重定向:/todoList”;
}
@RequestMapping(value=“/login”,method=RequestMethod.GET)
公共字符串roomLogin(ModelMap模型,字符串错误){
//型号。放置(“名称”,名称);
if(错误!=null){
model.addAttribute(“errorMsg”,“用户名或密码无效”);
}
返回“房间”;
}
/*@RequestMapping(value=“/login”,method=RequestMethod.GET)
公共字符串showLogin(ModelMap模型){
//型号。放置(“名称”,名称);
返回“欢迎”;
}*/
@请求映射(value=“/welcome”)
公共字符串showWelcome(ModelMap模型){
返回“登录”;
}
}
我的登录页面
Todo应用程序
${message}
姓名:
密码:
提交
成功登录后,应转到下面的页面
Todo应用程序
名称:${pageContext.request.userPrincipal.Name}
身份证件
课程
结束日期
完成了吗
${item.id}
${item.course}
${item.isdone?'Yes':'No'}
服务等级
包com.example.SpringLogin.service;
导入java.util.ArrayList;
导入java.util.Date;
导入java.util.Iterator;
导入java.util.List;
导入org.springframework.stereotype.Service;
导入com.example.SpringLogin.model.todoList;
@服务
公共类TodoService{
public static List todos=new ArrayList();
公共静态int todoCount=5;
静止的{
添加(新todoList(1,“Sudhakar”,“研究历史”,新日期(),false));
添加(新todoList(2,“Sudhakar”,“学习地理”,新日期(),false));
添加(新todoList(3,“Sudhakar”,“Study GK”,new Date(),false));
add(newtodolist(4,“Mani”,“studyjava”,newdate(),false));
添加(新的todoList(5,“Mani”,“学习脚本”,新日期(),false));
}
公共列表检索路径(字符串名称){
检索到的列表=新的ArrayList();
for(todoList todo:todos){
if(todo.getName().equalsIgnoreCase(名称)){
已检索。添加(todo);
}
}
检索到的返回;
}
public void addTodo(字符串名称、字符串课程、日期、布尔isDone){
add(newtodolist(++todoCount,name,Course,date,isDone));
}
公共todoList retrieveTodo(内部id){
for(todoList todo:todos){
if(todo.getId()==id){
返回待办事项;
}
}
返回null;
}
公共列表更新todo(todoList todo){
/*for(todoList td:todos){
if(td.getId()==todo.getId()){
td.setCourse(todo.getCourse());
td.setDate(todo.getDate());
}
}*/
todo。删除(todo);
待办事项。添加(待办事项);
返回待办事项;
}
//它将删除待办事项
公共void deleteTodo(内部id){
迭代器it=todos.Iterator();
while(it.hasNext()){
todoList td=it.next();
if(td.getId()==id){
it.remove();
}
}
}
}
我的期望是使用用户名登录应用程序
.formLogin()
.loginPage("/login")
.loginProcessingUrl("/do_login")
.defaultSuccessUrl("/index")
.formLogin()
.loginPage("/login.html")
.loginProcessingUrl("/perform_login")
.defaultSuccessUrl("/homepage.html", true)