1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > mysql 权限信息存储库_springboot-security02FromDB 权限管理(用户信息和角色信息

mysql 权限信息存储库_springboot-security02FromDB 权限管理(用户信息和角色信息

时间:2020-06-18 00:08:37

相关推荐

mysql 权限信息存储库_springboot-security02FromDB 权限管理(用户信息和角色信息

场景

代码

springboot+springsecurity+mysql(jpa)实现:

1.pom依赖:

org.springframework.boot

spring-boot-starter-security

org.springframework.boot

spring-boot-starter-thymeleaf

org.springframework.boot

spring-boot-starter-data-jpa

mysql

mysql-connector-java

2.application配置:

spring.thymeleaf.prefix=classpath:/page/

#mysql连接地址 spring.datasource.url=jdbc:mysql://localhost:3307/springboot_test #mysql用户名和密码 spring.datasource.username=root spring.datasource.password=root #driver驱动 spring.datasource.driver-class-name=com.mysql.jdbc.Driver #show sql spring.jpa.show-sql=true # Hibernate ddl auto (create, create-drop, update) #### hibernate的ddl-auto=update配置表名,数据库的表和列会自动创建(根据Java实体) spring.jpa.hibernate.ddl-auto=update # 方言 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

3.连接数据库:db->bean->dao->service

public interface UserDao extends JpaRepository{

User findByUserName(String userName);

User findByUserNameAndPassword(String userName, String password);

}

@Servicepublic classUserService {

@AutowiredprivateUserDao userDao;publicUser findById(Long id){returnuserDao.findOne(id);

}publicUser findByUserName(String userName){returnuserDao.findByUserName(userName);

}publicUser login(String userName, String password){returnuserDao.findByUserNameAndPassword(userName, password);

}public ListuserList(){returnuserDao.findAll();

}

}

实体类User

@Entity

@Table(name= "user")public class User implementsUserDetails {

@Id

@GeneratedValue(strategy=GenerationType.AUTO)privateLong id;privateString userName;privateString password;privateString pwdBak;privateString role;publicLong getId() {returnid;

}public voidsetId(Long id) {this.id =id;

}publicString getUserName() {returnuserName;

}public voidsetUserName(String userName) {this.userName =userName;

}

@Overridepublic Collection extends GrantedAuthority>getAuthorities() {

List auths = new ArrayList<>();

auths.add(new SimpleGrantedAuthority(this.getRole()));returnauths;

}publicString getPassword() {returnpassword;

}

@OverridepublicString getUsername() {return this.userName;

}

@Overridepublic booleanisAccountNonExpired() {return true;

}

@Overridepublic booleanisAccountNonLocked() {return true;

}

@Overridepublic booleanisCredentialsNonExpired() {return true;

}

@Overridepublic booleanisEnabled() {return true;

}public voidsetPassword(String password) {this.password =password;

}publicString getPwdBak() {returnpwdBak;

}public voidsetPwdBak(String pwdBak) {this.pwdBak =pwdBak;

}publicString getRole() {returnrole;

}public voidsetRole(String role) {this.role =role;

}

@OverridepublicString toString() {return "User{" +

"id=" + id +

", userName='" + userName + '\'' +

", password='" + password + '\'' +

", pwdBak='" + pwdBak + '\'' +

", role='" + role + '\'' +

'}';

}

}

4.websecurity配置:

@Configuration

@EnableWebSecurity

@EnableGlobalMethodSecurity(prePostEnabled= true)//开启进入Controller之前,检验权限。这个注解配置后,[emailprotected]("hasAnyAuthority('ADMIN')")才会生效

public class WebSecurityConfig extendsWebSecurityConfigurerAdapter{

@SuppressWarnings("SpringJavaAutowiringInspection")

@AutowiredprivateMyUDService myUDService;

@Bean

@Overrideprotected AuthenticationManager authenticationManager() throwsException {return super.authenticationManager();

}

@Overrideprotected void configure(HttpSecurity httpSecurity) throwsException {

httpSecurity.authorizeRequests()

.antMatchers("/", "/login", "/err/*").permitAll() //无需验证权限

.anyRequest().authenticated() //其他地址的访问均需验证权限

.and().formLogin().loginPage("/login").defaultSuccessUrl("/home").permitAll()//指定登录页是"/login"//登录成功后默认跳转到"/home"

.and().logout().logoutSuccessUrl("/login").permitAll(); //退出登录后的默认url是"/login"

}/*** 全局配置

*@parambuilder

*@throwsException*/@Autowiredpublic void configure(AuthenticationManagerBuilder builder) throwsException {

builder

.userDetailsService(myUDService)

.passwordEncoder(this.passwordEncoder());

}/*** 设置用户密码的加密方式:MD5加密

*@return

*/@BeanpublicPasswordEncoder passwordEncoder(){

PasswordEncoder pe= new PasswordEncoder() {//自定义密码加密方式//加密

@OverridepublicString encode(CharSequence charSequence) {returnMD5Util.encode((String)charSequence);

}//校验密码

@Overridepublic booleanmatches(CharSequence charSequence, String s) {returnMD5Util.encode((String)charSequence).equals(s);

}

};returnpe;

}

}

5.用户权限查询类UserDetailsService:

@Componentpublic class MyUDService implementsUserDetailsService {

@AutowiredprivateUserService userService;

@Overridepublic UserDetails loadUserByUsername(String s) throwsUsernameNotFoundException {

User user=userService.findByUserName(s);if(user == null) {throw new UsernameNotFoundException("UserName " + s + " not found");

}

System.out.println("用户" + s + ":" +user);returnuser;

}

}

6.启动类:

@SpringBootApplicationpublic classStart02App {public static voidmain(String[] args) {

SpringApplication.run(Start02App.class, args);

}/*** 自定义异常页*/@BeanpublicEmbeddedServletContainerCustomizer containerCustomizer() {return newEmbeddedServletContainerCustomizer(){

@Overridepublic voidcustomize(ConfigurableEmbeddedServletContainer container) {

container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/error/404"));

container.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error/500"));

container.addErrorPages(new ErrorPage(java.lang.Throwable.class,"/error/500"));

container.addErrorPages(new ErrorPage(HttpStatus.FORBIDDEN,"/error/403"));

}

};

}

}

7.页面

8.往数据库插入数据(单元测试):

@RunWith(SpringRunner.class)

@SpringBootTest(classes= Start02App.class)public classUserServiceTest {

@AutowiredprivateUserDao userDao;

@AutowiredprivateUserService userService;private ObjectMapper objectMapper = newObjectMapper();

@Testpublic void testAll() throwsJsonProcessingException {this.saveUser();this.list();

}private void saveUser() throwsJsonProcessingException {

User admin= newUser();

admin.setUserName("admin");

admin.setPassword(MD5Util.encode("admin"));

admin.setPwdBak("admin");

admin.setRole("ADMIN");

User adminSave=userDao.save(admin);for(int i=0;i<=5;i++) {

System.out.println("admin save--->:" +objectMapper.writeValueAsString(adminSave));

User user= newUser();

user.setUserName("test"+i);

user.setPassword(MD5Util.encode("user" +i));

user.setPwdBak("user" +i);

user.setRole("USER");

User userSave=userDao.save(user);

System.out.println("user save--->:" +objectMapper.writeValueAsString(userSave));

}

}private void list() throwsJsonProcessingException {

List userList =userService.userList();

System.out.println("用户列表:" +objectMapper.writeValueAsString(userList));

}

}

查看数据库:

效果

启动app类,访问:http://localhost:8080/

测试:

先点击“去主页”或“查看用户列表”,要求输入用户名密码:

使用admin登录,跳转到主页:

返回后,点击去“用户列表”,跳转到403,提示没有权限:

注销后使用普通用户登录,可以跳转到用户列表页面:

测试500页面:

测试404页面:

mysql 权限信息存储库_springboot-security02FromDB 权限管理(用户信息和角色信息保存在数据库)详解...

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。