当前位置: 首页 > news >正文

长湖南营销型网站天津网络公司流程

长湖南营销型网站,天津网络公司流程,WordPress卡密充值代码,hugo 怎么做网站1、用户自定义 在前面的案例中#xff0c;我们的登录用户是基于配置文件来配置的(本质是基于内存)#xff0c;但是在实际开发中#xff0c;这种方式肯定是不可取的#xff0c;在实际项目中#xff0c;用户信息肯定要存入数据库之中。 Spring Security支持多种用户定义方…1、用户自定义 在前面的案例中我们的登录用户是基于配置文件来配置的(本质是基于内存)但是在实际开发中这种方式肯定是不可取的在实际项目中用户信息肯定要存入数据库之中。 Spring Security支持多种用户定义方式接下来我们就逐个来看一下这些定义方式。通过前面的介绍(参见3小节),大家对于UserDetailsService以及它的子类都有了一定的了解, 自定义用户其实就是使用UserDetailsService的不同实现类来提供用户数据同时将配置好的 UserDetailsService 配置给 AuthenticationManagerBuilder系统再将 UserDetailsSeivice 提供给 AuthenticationProvider 使用。 1.1、基于内存 前面案例中用户的定义本质上还是基于内存只是我们没有将InMemoryUserDetailsManager类明确抽出来自定义现在我们通过自定义InMemoryUserDetailsManager来看一下基于内存的用户是如何自定义的。 重写 WebSecurityConfigurerAdapter 类的 configure(AuthenticationManagerBuilder)方法内容如下 Override protected void configure(AuthenticationManagerBuilder auth) throws Exception {InMemoryUserDetailsManager manager new InMemoryUserDetailsManager();manager.createUser(User.withUsername(buretuzi).password({noop}123456).roles(admin).build());manager.createUser(User.withUsername(sang).password({noop}123).roles(user).build());auth.userDetailsService(manager); }首先构造了一个InMemoryUserDetailsManager实例调用该实例的createUser方法来创建用户对象我们在这里分别设置了用户名、密码以及用户角色。需要注意的是用户密码加了 一个{noop}前缀表示密码不加密明文存储(关于密码加密问题会在后面的章节中专门介绍)。 配置完成后启动项目此时就可以使用这里配置的两个用户登录了。 InMemoryUserDetailsManager 的实现原理很简单它间接实现了 UserDetailsService 接口并重写了它里边的 loadUserByUsername方法同时它里边维护了 一个HashMap变量Map的 key 就是用户名value则是用户对象createUser就是往这个Map中存储数据loadUserByUsername方法则是从该Map中读取数据这里的源码比较简单就不贴出来了读者可以自行查看。 1.2、基于JdbcUserDetailsManager JdbcUserDetailsManager支持将用户数据持久化到数据库同时它封装了一系列操作用户的方法例如用户的添加、更新、查找等。 Spring Security 中为 JdbcUserDetailsManager 提供了数据库脚本位置在 org/springframework/security/core/userdetails/jdbc/users.ddl 内容如下注意将varchar_ignorecase改为varchar create table users(username varchar_ignorecase(50) not null primary key, password varchar_ignorecase(500) not null,enabled boolean not null);create table authorities (username varchar_ignorecase(50) not null,authority varchar_ignorecase(50) not null,constraint fk_authorities_users foreign key(username) references users(username));create unique index ix_auth_username on authorities (username,authority);可以看到这里一共创建了两张表users表就是存放用户信息的表authorities则是存放用户角色的表。但是大家注意SQL的数据类型中有一个varchar_ignorecase这个其实是针对 HSQLDB 的数据类型我们这里使用的是MySQL数据库所以这里手动将varchar_ignorecase 类型修改为varchar类型然后去数据库中执行修改后的脚本。 另一方面由于要将数据存入数据库中所以我们的项目也要提供数据库支持 JdbcUserDetailsManager底层实际上是使用JdbcTemplate来完成的所以这里主要添加两个依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-jdbc/artifactId /dependency dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdscoperuntime/scope /dependency然后在resources/application.yml中配置数据库连接信息 spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/springboot?useUnicodetruecharacterEncodingutf-8serverTimezoneUTCuseSSLtrueusername: rootpassword: 123456配置完成后我们重写WebSecurityConfigurerAdapter类的 configure(AuthenticationManagerBuilder auth)方法内容如下注意版本不得低于以下版本 dependencygroupIdorg.springframework.security/groupIdartifactIdspring-security-web/artifactIdversion5.3.6.RELEASE/version /dependency dependencygroupIdorg.springframework.security/groupIdartifactIdspring-security-core/artifactIdversion5.3.6.RELEASE/version /dependencypackage com.intehel.demo.config;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.core.userdetails.User; import org.springframework.security.provisioning.JdbcUserDetailsManager; import javax.sql.DataSource;Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter {AutowiredDataSource dataSource;Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {JdbcUserDetailsManager manager new JdbcUserDetailsManager(dataSource);if (!manager.userExists(buretuzi)){manager.createUser(User.withUsername(buretuzi).password({noop}123456).roles(admin).build());}if (!manager.userExists(song)){manager.createUser(User.withUsername(sang).password({noop}123).roles(user).build());}auth.userDetailsService(manager);} }当引入spring-boot-starter-jdbc并配置了数据库连接信息后一个DataSource实例就有了这里首先引入DataSource实例。在 configure 方法中创建一个 JdbcUserDetailsManager 实例在创建时传入 DataSource 实例。通过userExists方法可以判断一个用户是否存在该方法本质上就是去数据库中査询对应的用户如果用户不存在则通过createUser方法可以创建一个用户该方法本质上就是向数据库中添加一个用户。在 configure 方法中创建一个 JdbcUserDetailsManager 实例在创建时传入 DataSource 实例。通过userExists方法可以判断一个用户是否存在该方法本质上就是去数据库中査询对应的用户如果用户不存在则通过createUser方法可以创建一个用户该方法本质上就是向数据库中添加一个用户。 配置完成后重启项目如果项目启动成功数据库中就会自动添加进来两条数据如图2-22、图2-23所示。 此时我们就可以使用buretuzi/123456sang/123进行登录测试了。 在 JdbcUserDetailsManager 的继承体系中,首先是 JdbcDaoImpl 实现了 UserDetailsService 接口并实现了基本的loadUserByUsername方法JdbcUserDetailsManager则继承自 JdbcDaoImpl,同时完善了数据库操作又封装了用户的增删改査方法这里我们以 loadUserByUsername为例看一下源码其余的增删改操作相对来说都比较容易这里就不再赘述了。 JdbcDaoImpl#loadUserByUsername public class JdbcDaoImpl extends JdbcDaoSupport implements UserDetailsService, MessageSourceAware {public static final String DEF_USERS_BY_USERNAME_QUERY select username,password,enabled from users where username ?;public static final String DEF_AUTHORITIES_BY_USERNAME_QUERY select username,authority from authorities where username ?;public static final String DEF_GROUP_AUTHORITIES_BY_USERNAME_QUERY select g.id, g.group_name, ga.authority from groups g, group_members gm, group_authorities ga where gm.username ? and g.id ga.group_id and g.id gm.group_id;protected MessageSourceAccessor messages SpringSecurityMessageSource.getAccessor();private String authoritiesByUsernameQuery select username,authority from authorities where username ?;private String groupAuthoritiesByUsernameQuery select g.id, g.group_name, ga.authority from groups g, group_members gm, group_authorities ga where gm.username ? and g.id ga.group_id and g.id gm.group_id;private String usersByUsernameQuery select username,password,enabled from users where username ?;private String rolePrefix ;private boolean usernameBasedPrimaryKey true;private boolean enableAuthorities true;private boolean enableGroups;public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {ListUserDetails users this.loadUsersByUsername(username);if (users.size() 0) {this.logger.debug(Query returned no results for user username );throw new UsernameNotFoundException(this.messages.getMessage(JdbcDaoImpl.notFound, new Object[]{username}, Username {0} not found));} else {UserDetails user (UserDetails)users.get(0);SetGrantedAuthority dbAuthsSet new HashSet();if (this.enableAuthorities) {dbAuthsSet.addAll(this.loadUserAuthorities(user.getUsername()));}if (this.enableGroups) {dbAuthsSet.addAll(this.loadGroupAuthorities(user.getUsername()));}ListGrantedAuthority dbAuths new ArrayList(dbAuthsSet);this.addCustomAuthorities(user.getUsername(), dbAuths);if (dbAuths.size() 0) {this.logger.debug(User username has no authorities and will be treated as not found);throw new UsernameNotFoundException(this.messages.getMessage(JdbcDaoImpl.noAuthority, new Object[]{username}, User {0} has no GrantedAuthority));} else {return this.createUserDetails(username, user, dbAuths);}}}protected ListUserDetails loadUsersByUsername(String username) {return this.getJdbcTemplate().query(this.usersByUsernameQuery, new String[]{username}, (rs, rowNum) - {String username1 rs.getString(1);String password rs.getString(2);boolean enabled rs.getBoolean(3);return new User(username1, password, enabled, true, true, true, AuthorityUtils.NO_AUTHORITIES);});} }首先根据用户名调用loadUserByUsername方法去数据库中查询用户查询出来的是一个List集合集合中如果没有数据说明用户不存在则直接抛出异常。如果集合中存在数据则将集合中的第一条数据拿出来然后再去查询用户角色 最后根据这些信息创建一个新的UserDetails出来。需要注意的是这里还引入了分组的概念不过考虑到JdbcUserDetailsManager并非我们实际项目中的主流方案因此这里不做过多介绍。 这就是使用JdbcUserDetailsManager做数据持久化。这种方式看起来简单都不用开发者自己写SQL,但是局限性比较大无法灵活地定义用户表、角色表等而在实际开发中我们还是希望能够灵活地掌控数据表结构因此JdbcUserDetailsManager使用场景非常有限。 1.3、基于 MyBatis 使用MyBatis做数据持久化是目前大多数企业应用釆取的方案Spring Security中结合 MyBatis可以灵活地定制用户表以及角色表我们对此进行详细介绍。 首先需要设计三张表分别是用户表、角色表以及用户角色关联表三张表的关系如图 2-24所示。 用户和角色是多对多的关系我们使用user_role来将两者关联起来。 数据库脚本如下 CREATE TABLE role(id INT(11) NOT NULL AUTO_INCREMENT,name VARCHAR(32) DEFAULT NULL,nameZh VARCHAR(32) DEFAULT NULL,PRIMARY KEY(id) )ENGINEINNODB DEFAULT CHARSETutf8CREATE TABLE user (id INT(11) NOT NULL AUTO_INCREMENT,username VARCHAR(32) DEFAULT NULL,password VARCHAR(255) DEFAULT NULL,enabled TINYINT(1) DEFAULT NULL,accountNonExpired TINYINT(1) DEFAULT NULL,accountNonLocked TINYINT(1) DEFAULT NULL,credentialsNonExpired TINYINT(1) DEFAULT NULL,PRIMARY KEY(id) )ENGINEINNODB DEFAULT CHARSETutf8CREATE TABLE user_role(id INT(11) NOT NULL AUTO_INCREMENT,uid INT(11) DEFAULT NULL,rid INT(11) DEFAULT NULL,PRIMARY KEY(id),KEY uid (uid),KEY rid (rid) )ENGINEINNODB DEFAULT CHARSETutf8对于角色表三个字段从上往下含义分别为角色id、角色英文名称以及角色中文名称 对于用户表七个字段从上往下含义依次为用户id、用户名、用户密码、账户是否可用、账户是否没有过期、账户是否没有锁定以及凭证(密码)是否没有过期。   数据库创建完成后可以向数据库中添加几条模拟数据代码如下 INSERT INTO role (id,name,nameZh) VALUES(1,ROLE_dba,数据库管理员),(2,ROLE_admin,系统管理员),(3,ROLE_user,用户);INSERT INTO user (id,username,password,enabled,accountNonExpired,accountNonLocked,credentialsNonExpired) VALUES(1,root,{noop}123,1,1,1,1),(2,admin,{noop}123,1,1,1,1),(3,sang,{noop}123,1,1,1,1);INSERT INTO user_role (id,uid,rid) VALUES(1,1,1),(2,1,2),(3,2,2),(4,3,3);这样数据库的准备工作就算完成了。 在Spring Security项目中我们需要引入MyBatis和MySQL依赖代码如下 dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion2.2.2/version /dependency dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdscoperuntime/scope /dependency同时在resources/application.yml中配置数据库基本连接信息 spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/springboot?useUnicodetruecharacterEncodingutf-8serverTimezoneUTCuseSSLtrueusername: rootpassword: 123456接下来创建用户类和角色类 package com.intehel.demo.domain;import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import java.util.ArrayList; import java.util.Collection; import java.util.List; import lombok.Data;Data public class User implements UserDetails {private Integer id;private String username;private String password;private Boolean enabled;private Boolean accountNonExpired;private Boolean accountNonLocked;private Boolean credentialsNonExpired;private ListRole roles new ArrayListRole();Overridepublic Collection? extends GrantedAuthority getAuthorities() {ListSimpleGrantedAuthority authorities new ArrayList();for (Role role : roles) {authorities.add(new SimpleGrantedAuthority(role.getName()));}return authorities;}Overridepublic boolean isAccountNonExpired() {return accountNonExpired;}Overridepublic boolean isAccountNonLocked() {return accountNonLocked;}Overridepublic boolean isCredentialsNonExpired() {return credentialsNonExpired;}Overridepublic boolean isEnabled() {return enabled;} }package com.intehel.demo.domain; import lombok.Data; Data public class Role {private Integer id;private String name;private String nameZh; }自定义用户类需要实现UserDetails接口并实现接口中的方法这些方法的含义我们在 3小节中已经介绍过了这里不再赘述。其中roles属性用来保存用户所具备的角色信息 由于系统获取用户角色调用的方法是getAuthorities所以我们在getAuthorities方法中将roles 中的角色转为系统可识别的对象并返回。 package com.intehel.demo.mapper;import com.intehel.demo.domain.Role; import com.intehel.demo.domain.User; import org.apache.ibatis.annotations.Mapper; import java.util.List;Mapper public interface UserMapper{ListRole getRolesByUid(Integer id);User loadUserByUsername(String username); }package com.intehel.demo.service;import com.intehel.demo.domain.User; import com.intehel.demo.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException;public class MyUserDetailsService implements UserDetailsService {AutowiredUserMapper userMapper;Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {User user userMapper.loadUserByUsername(username);if (user null) {throw new UsernameNotFoundException(用户不存在);}user.setRoles(userMapper.getRolesByUid(user.getId()));return user;} }自定义 MyUserDetailsService实现UserDetailsSeivice接口并实现该接口中的方法。 loadUserByUsername方法经过前面章节的讲解相信大家已经很熟悉了该方法就是根据用户名去数据库中加载用户如果从数据库中没有査到用户则抛出UsemameNotFoundException 异常如果査询到用户了则给用户设置roles属性。 UserMapper中定义两个方法用于支持MyUserDetailsService中的査询操作。 最后,在UserMapper.xml中定义查询SQL,代码如下 ?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.intehel.demo.mapper.UserMapperselect idloadUserByUsername resultTypecom.intehel.demo.domain.Userselect * from user where username #{username}/selectselect idloadUserByUsername resultTypecom.intehel.demo.domain.Roleselect r.* from role r,user_role ur where r.idur.rid/select /mapper将mylogin.html放在 resources/templates/ 下mylogin.html如下: !DOCTYPE html html langen xmlns:thhttp://www.thymeleaf.org headmeta charsetUTF-8title登录/titlelink href//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/css/bootstrap.min.css relstylesheet idbootstrap-cssscript src//maxcdn.bootstrapcdn.com/bootstrap/4.1.1/js/bootstrap.min.js/scriptscript src//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js/script /head style#login .container #login-row #login-column #login-box {border: 1px solid #9c9c9c;background-color: #EAEAEA;} /style body div idlogindiv classcontainerdiv idlogin-row classrow justify-content-center align-items-centerdiv idlogin-column classcol-md-6div idlogin-box classcol-md-12form idlogin-form classform action/doLogin methodposth3 classtext-center text-info登录/h3!--/*thymesVar idSPRING_SECURITY_LAST_EXCEPTION typecom*/--div th:text${SPRING_SECURITY_LAST_EXCEPTION}/divdiv classform-grouplabel forusername classtext-info用户名/labelbrinput typetext nameuname idusername classform-control/divdiv classform-grouplabel forpassword classtext-info密码/labelbrinput typetext namepasswd idpassword classform-control/divdiv classform-groupinput typesubmit namesubmit classbtn btn-info btn-md value登录/div/form/div/div/div/div /div /body /html为了方便我们将UserMapper.xml文件放在resources/mapper下UsetMapper接口放在mapper包下。为了防止 Maven打包时自动忽略了 XML文件还需要在application.yml中添加mapper-locations配置 # 应用名称 spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/springboot?useUnicodetruecharacterEncodingutf-8serverTimezoneUTCuseSSLtrueusername: rootpassword: 123456security:user:name: buretuzipassword: 123456application:name: demothymeleaf:mode: HTMLencoding: UTF-8servlet:content-type: text/htmlcache: falseprefix: classpath:/templates/# 应用服务 WEB 访问端口 server:port: 8080 mybatis:# spring boot集成mybatis的方式打印sqlmapper-locations: classpath:/mapper/*.xmlconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl最后一步就是在 SecurityConfig 中注入 UserDetailsService package com.intehel.demo.config;import com.fasterxml.jackson.databind.ObjectMapper; import com.intehel.demo.handler.MyAuthenticationFailureHandler; import com.intehel.demo.service.MyUserDetailsService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.core.userdetails.User; import org.springframework.security.provisioning.JdbcUserDetailsManager; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import org.springframework.security.web.util.matcher.OrRequestMatcher; import javax.sql.DataSource; import java.util.HashMap; import java.util.Map;Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter {AutowiredMyUserDetailsService myUserDetailsService;Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().formLogin().loginPage(/mylogin.html).loginProcessingUrl(/doLogin).defaultSuccessUrl(/index.html).failureHandler(new MyAuthenticationFailureHandler()).usernameParameter(uname).passwordParameter(passwd).permitAll().and().logout().logoutRequestMatcher(new OrRequestMatcher(new AntPathRequestMatcher(/logout1,GET),new AntPathRequestMatcher(/logout2,POST))).invalidateHttpSession(true).clearAuthentication(true).defaultLogoutSuccessHandlerFor((req,resp,auth)-{resp.setContentType(application/json;charsetUTF-8);MapString,Object result new HashMapString,Object();result.put(status,200);result.put(msg,使用logout1注销成功);ObjectMapper om new ObjectMapper();String s om.writeValueAsString(result);resp.getWriter().write(s);},new AntPathRequestMatcher(/logout1,GET)).defaultLogoutSuccessHandlerFor((req,resp,auth)-{resp.setContentType(application/json;charsetUTF-8);MapString,Object result new HashMapString,Object();result.put(status,200);result.put(msg,使用logout2注销成功);ObjectMapper om new ObjectMapper();String s om.writeValueAsString(result);resp.getWriter().write(s);},new AntPathRequestMatcher(/logout1,GET)).and().csrf().disable();}Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(myUserDetailsService);} }配置UserDetailsService的方式和前面配置JdbcUserDetailsManager的方式基本一致只不过配置对象变成了 myUserDetailsService而己。至此整个配置工作就完成了。 接下来启动项目利用数据库中添加的模拟用户进行登录测试就可以成功登录了测试方式和前面章节一致这里不再赘述。 1.4、基于 Spring Data JPA 考虑到在Spring Boot技术栈中也有不少人使用Spring Data JPA,因此这里针对Spring SecuritySpring Data JPA也做一个简单介绍具体思路和基于MyBatis的整合类似。 首先引入Spring Data JPA的依赖和MySQL依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-jpa/artifactId /dependency dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdscoperuntime/scope /dependency然后在resources/application.yml中配置数据库和JPA,代码如下 spring:datasource:druid:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/springboot?useUnicodetruecharacterEncodingutf-8serverTimezoneUTCuseSSLtrueusername: rootpassword: 123456jpa:database: mysqldatabase-platform: mysqlhibernate:ddl-auto: updateshow-sql: trueproperties:hibernate:dialect: org.hibernate.dialect.Mysql8Dialect据库的配置还是和以前一样JPA的配置则主要配置了数据库平台数据表更新方式、 是否打印SQL以及对应的数据库方言。 使用Spring Data JPA的好处是我们不用提前准备SQL脚本所以接下来配置两个数据库实体类即可 package com.intehel.demo.domain;import lombok.Data; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import javax.persistence.*; import java.util.ArrayList; import java.util.Collection; import java.util.List;Entity Data public class User implements UserDetails {IdGeneratedValue(strategy GenerationType.IDENTITY)private long id;private String username;private String password;private Boolean enabled;private Boolean accountNonExpired;private Boolean accountNonLocked;private Boolean credentialsNonExpired;ManyToMany(fetch FetchType.EAGER,cascade CascadeType.PERSIST)private ListRole roles;Overridepublic Collection? extends GrantedAuthority getAuthorities() {ListSimpleGrantedAuthority authorities new ArrayList();for (Role role : roles) {authorities.add(new SimpleGrantedAuthority(role.getName()));}return authorities;}Overridepublic String getPassword() {return password;}Overridepublic String getUsername() {return username;}Overridepublic boolean isAccountNonExpired() {return accountNonExpired;}Overridepublic boolean isAccountNonLocked() {return accountNonLocked;}Overridepublic boolean isCredentialsNonExpired() {return credentialsNonExpired;}Overridepublic boolean isEnabled() {return enabled;} }package com.intehel.demo.domain;import lombok.Data; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id;Data Entity(name role) public class Role {IdGeneratedValue(strategy GenerationType.IDENTITY)private Integer id;private String name;private String nameZh; }这两个实体类和前面MyBatis中实体类的配置类似需要注意的是roles属性上多了一个 多对多配置。 接下来配置UserDetailsService,并提供数据查询方法 package com.intehel.demo.dao;import com.intehel.demo.domain.User; import org.springframework.data.jpa.repository.JpaRepository;public interface UserDao extends JpaRepositoryUser,Integer {User findUserByUsername(String username); }package com.intehel.demo.Service;import com.intehel.demo.dao.UserDao; import com.intehel.demo.domain.User; import org.springframework.beans.factory.annotation.Autowired; 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;Service public class MyUserDetailsService implements UserDetailsService {AutowiredUserDao userDao;Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {User user userDao.findUserByUsername(username);if (user null) {throw new UsernameNotFoundException(用户不存在);}return user;} }MyUserDetailsService的定义也和前面的类似不同之处在于数据查询方法的变化。定义 UserDao 继承自 JpaRepository,并定义一个 findUserByUsername 方法剩下的事情 Spring Data JPA框架会帮我们完成。 最后再在 SecurityConfig 中配置 MyUserDetailsService配置方式和 MyBatis 一模一样 这里就不再把代码贴岀来了。使用了 Spring Data JPA之后当项目启动时会自动在数据库中创建相关的表而不用我们自己去写脚本这也是使用Spring Data JPA的方便之处。 为了测试方便我们可以在单元测试中执行如下代码向数据库中添加测试数据 package com.intehel.demo;import com.intehel.demo.dao.UserDao; import com.intehel.demo.domain.Role; import com.intehel.demo.domain.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.ArrayList; import java.util.List;SpringBootTest class DemoApplicationTests {AutowiredUserDao userDao;Testvoid contextLoads() {User user1 new User();user1.setUsername(buretuzi);user1.setPassword({noop}123);user1.setAccountNonExpired(true);user1.setAccountNonLocked(true);user1.setCredentialsNonExpired(true);user1.setEnabled(true);ListRole roles new ArrayList();Role r1 new Role();r1.setName(ROLE_admin);r1.setNameZh(管理员);roles.add(r1);user1.setRoles(roles);userDao.save(user1);}}测试数据添加成功之后接下来启动项目使用测试数据进行登录测试具体测试过程就不再赘述了。 至此四种不同的用户定义方式就介绍完了。这四种方式异曲同工只是数据存储的方式不一样而已其他的执行流程都是一样的。
http://www.zqtcl.cn/news/126898/

相关文章:

  • 网站设计的公司蒙特注册成立公司的基本流程
  • 成交型网站山西网络营销
  • 做网站必须在工信部备案吗网站开发英语
  • 门户网站模板图片建设厅网站初始数据入库
  • 甘肃三北防护林建设局网站阿里企业邮箱app
  • 沃尔沃公司网站建设公司建网站费用
  • 新网站怎么发外链公司做网站 要准备哪些素材
  • 建站域名英雄联盟网页制作素材
  • 手机网站 微信网站 区别布吉做网站
  • 网站建设层级图微信小程序怎么制作网页
  • 服务器上的网站怎么做301中小企业网站制作报价
  • 做网站需要用什么技术制作静态网站制作
  • drupal网站开发盐城网站建设费用
  • 采票网站刷流水做任务网站建设方案及预算
  • 传奇网站模块下载天蝎做网站建网站
  • 收录网站的二级域名wordpress虚拟币接口
  • 论坛建站烟台工程建设信息网站
  • 南京有哪些做网站的公司网站开发兼职团队
  • 网站建设优化外包免费客户管理软件哪个好用
  • 网上购物最便宜的网站微信官方网站服务中心
  • 充电网站建设方案个体工商户查询
  • 所有网站302跳转百度wordpress最大上传2g
  • 南京网站制作网页seo推广百度百科
  • 陵水网站建设哪家好建设培训考试服务网站
  • h5视频网站模板中国十大企业培训机构排名
  • 强的网站建设明细报价表网站建设推广新业务
  • 哪里有免费做网站wordpress 在文章前面加序号
  • 263企业邮箱登录入口首页seo公司哪家
  • 哈尔滨建设银行网站岳阳建设网站
  • 中山网页网站设计模板自己做的网站怎么让别人看见