diff --git a/pom.xml b/pom.xml index 96abc55..c966296 100644 --- a/pom.xml +++ b/pom.xml @@ -49,6 +49,16 @@ spring-security-test test + + + mysql + mysql-connector-java + runtime + + + org.springframework.boot + spring-boot-starter-data-jpa + diff --git a/readme.md b/readme.md index 37ccfbe..0d28f4d 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,8 @@ 端口:8081 [http://localhost:8081](http://localhost:8081]) -表单登录地址:http://localhost:8081/login.html \ No newline at end of file +表单登录地址:http://localhost:8081/login.html + +账号:admin,user + +密码:1234 \ No newline at end of file diff --git a/src/main/java/com/al/_01springsecuritydemo01/config/SecurityConfig.java b/src/main/java/com/al/_01springsecuritydemo01/config/SecurityConfig.java index 4026f71..c7f4223 100644 --- a/src/main/java/com/al/_01springsecuritydemo01/config/SecurityConfig.java +++ b/src/main/java/com/al/_01springsecuritydemo01/config/SecurityConfig.java @@ -11,6 +11,8 @@ import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; +import com.al._01springsecuritydemo01.service.UserDetailService; + @EnableWebSecurity // @Configuration 被包括在上面的注解了 public class SecurityConfig extends WebSecurityConfigurerAdapter { @@ -20,6 +22,9 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private AuthenticationFailureHandler failureHandler; + @Autowired + private UserDetailService userDetailService; + @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); @@ -57,6 +62,10 @@ protected void configure(HttpSecurity http) throws Exception { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.userDetailsService(userDetailService) + .passwordEncoder(passwordEncoder()); + System.out.println(passwordEncoder().encode("1234")); + /* auth.inMemoryAuthentication() .withUser("user") .password(passwordEncoder().encode("1234")) @@ -70,5 +79,6 @@ protected void configure(AuthenticationManagerBuilder auth) throws Exception { .and() .passwordEncoder(passwordEncoder()); ; + */ } } diff --git a/src/main/java/com/al/_01springsecuritydemo01/dao/UserDao.java b/src/main/java/com/al/_01springsecuritydemo01/dao/UserDao.java new file mode 100644 index 0000000..5d91942 --- /dev/null +++ b/src/main/java/com/al/_01springsecuritydemo01/dao/UserDao.java @@ -0,0 +1,10 @@ +package com.al._01springsecuritydemo01.dao; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.al._01springsecuritydemo01.entity.User; + +@Repository +public interface UserDao extends JpaRepository { +} diff --git a/src/main/java/com/al/_01springsecuritydemo01/entity/User.java b/src/main/java/com/al/_01springsecuritydemo01/entity/User.java new file mode 100644 index 0000000..8624b38 --- /dev/null +++ b/src/main/java/com/al/_01springsecuritydemo01/entity/User.java @@ -0,0 +1,80 @@ +package com.al._01springsecuritydemo01.entity; + +import java.util.Collection; +import java.util.List; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Transient; + +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "users") +@Data +@AllArgsConstructor +@NoArgsConstructor +public class User implements UserDetails { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column + private Long userId; + + @Column(name = "user_name") + private String userName; + + @Column(name = "password") + private String password; + + @Column(name = "status") + private String status; + + @Column(name = "roles") + private String roles; + + @Transient + private List authorities; + + public void setAuthorities(List authorities) { + this.authorities = authorities; + } + + @Override + public Collection getAuthorities() { + return this.authorities; + } + + @Override + public String getUsername() { + return this.userName; + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return true; + } +} diff --git a/src/main/java/com/al/_01springsecuritydemo01/service/UserDetailService.java b/src/main/java/com/al/_01springsecuritydemo01/service/UserDetailService.java new file mode 100644 index 0000000..b32d84b --- /dev/null +++ b/src/main/java/com/al/_01springsecuritydemo01/service/UserDetailService.java @@ -0,0 +1,27 @@ +package com.al._01springsecuritydemo01.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.authority.AuthorityUtils; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +import com.al._01springsecuritydemo01.entity.User; + +@Service +public class UserDetailService implements UserDetailsService { + @Autowired + private UserService userService; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + User user = userService.selectUserByUserName(username); + if (user == null) { + throw new UsernameNotFoundException("用户" + user.getUsername() + "不存在"); + } + // 设置权限 + user.setAuthorities(AuthorityUtils.commaSeparatedStringToAuthorityList(user.getRoles())); + return user; + } +} diff --git a/src/main/java/com/al/_01springsecuritydemo01/service/UserService.java b/src/main/java/com/al/_01springsecuritydemo01/service/UserService.java new file mode 100644 index 0000000..df6f989 --- /dev/null +++ b/src/main/java/com/al/_01springsecuritydemo01/service/UserService.java @@ -0,0 +1,7 @@ +package com.al._01springsecuritydemo01.service; + +import com.al._01springsecuritydemo01.entity.User; + +public interface UserService { + public User selectUserByUserName(String username); +} diff --git a/src/main/java/com/al/_01springsecuritydemo01/service/UserServiceImpl.java b/src/main/java/com/al/_01springsecuritydemo01/service/UserServiceImpl.java new file mode 100644 index 0000000..a6b6b80 --- /dev/null +++ b/src/main/java/com/al/_01springsecuritydemo01/service/UserServiceImpl.java @@ -0,0 +1,24 @@ +package com.al._01springsecuritydemo01.service; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Example; +import org.springframework.stereotype.Service; + +import com.al._01springsecuritydemo01.dao.UserDao; +import com.al._01springsecuritydemo01.entity.User; + +@Service +public class UserServiceImpl implements UserService { + @Autowired + private UserDao userDao; + + @Override + public User selectUserByUserName(String username) { + User user = new User(); + user.setUserName(username); + List list = userDao.findAll(Example.of(user)); + return list.isEmpty() ? null : list.get(0); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index bafddce..30ba351 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,5 @@ -server.port=8081 \ No newline at end of file +server.port=8081 +spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +spring.datasource.username=root +spring.datasource.password=1234 +spring.datasource.url=jdbc:mysql://localhost:3306/jwt_demo?serverTimezone=GMT%2B8&characterEncoding=utf-8 \ No newline at end of file