我成功地建立了内存中身份验证。但是,当我要用数据库构建它时,会出现此错误。
没有为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}
如果您有任何想法请告知。谢谢。
我更改了MyUserDetailsService类的添加passwordEncoder方法。
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(); }