gpt4 book ai didi

java - Spring 启动安全: Custom login page is never authenticating

转载 作者:行者123 更新时间:2023-11-30 02:03:56 26 4
gpt4 key购买 nike

我正在使用 Spring Boot 开发一个网络应用程序。我已经使用了 Spring Boot 安全性。

如果我使用 Spring Boot 默认登录页面,身份验证将按预期工作

但它不适用于自定义登录页面

如果我在 websecurity.java 中配置 http 端点时使用自定义登录页面,我将被重定向到登录页面

在下面分享示例代码和我的诊断。

@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableWebSecurity
@EnableJpaRepositories(basePackageClasses = UserRepository.class)
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
private CustomUserDetailsService userDetailsService;

@Override
public void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests().antMatchers("/resources/**").permitAll()
.anyRequest().authenticated()
.and().formLogin().loginPage("/loginPage")
.permitAll();

}

@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService)
.passwordEncoder(getPasswordEncoder());
}

private PasswordEncoder getPasswordEncoder() {
return new PasswordEncoder() {
@Override
public String encode(CharSequence charSequence) {
return charSequence.toString();
}

@Override
public boolean matches(CharSequence charSequence, String s) {
return true;
}
};
}
}

Controller :

@Controller
@EnableAutoConfiguration
@ComponentScan("com.shopping.service")
public class ShoppingController {

@Autowired
private ShoppingService service;

@RequestMapping("/")
public String index() {
return "";
}

@RequestMapping("/loginPage")
public String welcome(Map<String, Object> model) {
return "login";
}

@RequestMapping(value = "/register")
public String register(Model model) {
model.addAttribute("user", new User());
return "register";
}

@RequestMapping(value = "/submitRegistration", method = RequestMethod.POST)
public String submitRegistration(@ModelAttribute User user) {
User saved = service.save(user);
System.out.println(saved);
return "login";
}

@RequestMapping("/home")
public String home() {
return "home";
}
}

登录.html:

<form th:action="@{/loginPage}" method="post" th:object="${object}">
<div class="form-group">
<label for="username">Email address:</label>
<input type="email" name="username" class="form-control" id="username">
</div>
<div class="form-group">
<label for="password">Password:</label>
<input type="password" name="password" class="form-control" id="password">
</div>
<div class="checkbox">
<label><input type="checkbox"> Remember me</label>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
<a href="/register" class="btn btn-default">Register</a>
</form>

UserDetailsS​​ervice 使用 crud Repo 从数据库进行用户身份验证

public class CustomUserDetailsService implements UserDetailsService {

@Autowired
private UserRepository userRepo;

@Override
public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
Optional<User> optionalUser = userRepo.findByEmail(userName);
optionalUser.orElseThrow(() -> new UsernameNotFoundException("User Name not found"));
UserDetailsImpl userDetails = optionalUser.map(user -> new UserDetailsImpl(user)).get();
return userDetails;
}

}

public class UserDetailsImpl extends User implements UserDetails {

@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
}

public UserDetailsImpl(User user) {
this.setEmail(user.getEmail());
this.setAge(user.getAge());
this.setName(user.getName());
this.setId(user.getId());
this.setPassword(user.getPassword());
}

@Override
public String getPassword() {
return super.getPassword();
}

@Override
public String getUsername() {
return super.getEmail();
}

@Override
public boolean isAccountNonExpired() {
return true;
}

@Override
public boolean isAccountNonLocked() {
return true;
}

@Override
public boolean isCredentialsNonExpired() {
return true;
}

@Override
public boolean isEnabled() {
return true;
}

}

最佳答案

您需要指定用户名的 ID/名称和密码参数。

默认值为用户名密码,但您使用电子邮件密码

您可以更改安全配置中的默认值:

//...
and().formLogin()
.loginPage("/loginPage")
.usernameParameter("email").passwordParameter("password")
//...

请注意,您只需要更改与默认不同的方法,我只是想展示这两种方法。

编辑 1

第二个错误是表单操作,它必须是由 loginPage("/loginPage") 方法指定的操作,因此在本例中: th:action="@{/loginPage}"

此外,您的密码标签的 for 属性是错误的(在这种情况下必须是 password)。

我对此进行了测试,现在它对我有用。

编辑2

Spring 安全性并不像您想象的那样工作。它拦截表单的操作 URL,并将您重定向到您登录之前尝试访问的页面。如果您想更改此设置,可以使用 successForwardUrl()

在您的示例中:

//...
and().formLogin()
.loginPage("/loginPage")
.successForwardUrl("/home")
//...

关于java - Spring 启动安全: Custom login page is never authenticating,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51883643/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com