通过数据库身份验证,没有映射ID为“ null”的PasswordEncoder

我成功地建立了内存中身份验证。但是,当我要用数据库构建它时,会出现此错误。

没有为id“ null”映射的PasswordEncoder

接下来是教程- 初学者Spring Boot教程,10-使用Spring Security的高级身份验证|

强大的Java

有班

回答:

@Configuration

@EnableWebSecurity

public class SpringSecurityConfiguration extends

WebSecurityConfigurerAdapter{

@Autowired

private AuthenticationEntryPoint entryPoint;

@Autowired

private MyUserDetailsService userDetailsService;

@Override

protected void configure(AuthenticationManagerBuilder auth) throws Exception {

auth.userDetailsService(userDetailsService);

}

@Override

protected void configure(HttpSecurity http) throws Exception {

http.authorizeRequests().anyRequest().authenticated().and().httpBasic()

.authenticationEntryPoint(entryPoint);

}

}

回答:

@Configuration

public class AuthenticationEntryPoint extends BasicAuthenticationEntryPoint{

@Override

public void commence(HttpServletRequest request, HttpServletResponse response,

AuthenticationException authException) throws IOException, ServletException {

response.addHeader("WWW-Authenticate", "Basic realm -" +getRealmName());

response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);

PrintWriter writer = response.getWriter();

writer.println("Http Status 401 "+authException.getMessage());

}

@Override

public void afterPropertiesSet() throws Exception {

setRealmName("MightyJava");

super.afterPropertiesSet();

}

}

回答:

@Service

public class MyUserDetailsService implements UserDetailsService{

@Autowired

private UserRepository userRepository;

@Override

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

User user = userRepository.findByUsername(username);

if(user == null){

throw new UsernameNotFoundException("User Name "+username +"Not Found");

}

return new org.springframework.security.core.userdetails.User(user.getUserName(),user.getPassword(),getGrantedAuthorities(user));

}

private Collection<GrantedAuthority> getGrantedAuthorities(User user){

Collection<GrantedAuthority> grantedAuthority = new ArrayList<>();

if(user.getRole().getName().equals("admin")){

grantedAuthority.add(new SimpleGrantedAuthority("ROLE_ADMIN"));

}

grantedAuthority.add(new SimpleGrantedAuthority("ROLE_USER"));

return grantedAuthority;

}

}

回答:

public interface UserRepository extends JpaRepository<User, Long>{

@Query("FROM User WHERE userName =:username")

User findByUsername(@Param("username") String username);

}

回答:

@Entity

public class Role extends AbstractPersistable<Long>{

private String name;

@OneToMany(targetEntity = User.class , mappedBy = "role" , fetch = FetchType.LAZY ,cascade = CascadeType.ALL)

private Set<User> users;

//getter and setter

}

回答:

@Entity

public class User extends AbstractPersistable<Long>{

//AbstractPersistable class ignore primary key and column annotation(@Column)

private String userId;

private String userName;

private String password;

@ManyToOne

@JoinColumn(name = "role_id")

private Role role;

@OneToMany(targetEntity = Address.class, mappedBy = "user",fetch= FetchType.LAZY ,cascade =CascadeType.ALL)

private Set<Address> address; //Instead of Set(Unordered collection and not allow duplicates) we can use list(ordered and allow duplicate values) as well

//getter and setter}

如果您有任何想法请告知。谢谢。

回答:

我更改了MyUserDetailsS​​ervice类的添加passwordEncoder方法。

增加线

BCryptPasswordEncoder encoder = passwordEncoder();

换线

//changed, user.getPassword() as encoder.encode(user.getPassword())

return new org.springframework.security.core.userdetails.User(--)

回答:

@Override

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

BCryptPasswordEncoder encoder = passwordEncoder();

User user = userRepository.findByUsername(username);

if(user == null){

throw new UsernameNotFoundException("User Name "+username +"Not Found");

}

return new org.springframework.security.core.userdetails.User(user.getUserName(),encoder.encode(user.getPassword()),getGrantedAuthorities(user));

}

@Bean

public BCryptPasswordEncoder passwordEncoder() {

return new BCryptPasswordEncoder();

}

以上是 通过数据库身份验证,没有映射ID为“ null”的PasswordEncoder 的全部内容, 来源链接: utcz.com/qa/401871.html

回到顶部