10分钟搞定Java带token验证的注册登录

这是spring boot框架下的登录注册功能,并且带有token验证,可以用于生产环境的实例

原理太简单,直接上代码,让你知道什么叫拿来主义!!


1,java中项目介绍



 2,resources 中的内容


3,用法:
创建好所有的需要的类,,数据库中创建好需要的数据库,代码复制粘贴,启动,就可以用了


实际代码:
[java]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"  
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  5.     <modelVersion>4.0.0</modelVersion>  
  6.   
  7.     <groupId>com.test</groupId>  
  8.     <artifactId>loginDemo</artifactId>  
  9.     <version>1.0-SNAPSHOT</version>  
  10.     <packaging>jar</packaging>  
  11.   
  12.     <parent>  
  13.         <groupId>org.springframework.boot</groupId>  
  14.         <artifactId>spring-boot-starter-parent</artifactId>  
  15.         <version>1.5.3.RELEASE</version>  
  16.         <relativePath/> <!-- lookup parent from repository -->  
  17.     </parent>  
  18.   
  19.     <properties>  
  20.         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
  21.         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>  
  22.         <java.version>1.8</java.version>  
  23.         <hikaricp.version>2.6.1</hikaricp.version>  
  24.         <jjwt.version>0.7.0</jjwt.version>  
  25.         <serenity.version>1.4.1-rc.7</serenity.version>  
  26.         <serenity.jbehave.version>1.26.0-rc.3</serenity.jbehave.version>  
  27.         <rest-assured.version>3.0.3</rest-assured.version>  
  28.         <maven-surefire-plugin.version>2.19.1</maven-surefire-plugin.version>  
  29.         <fabric-sdk-java.version>1.0.0-beta2</fabric-sdk-java.version>  
  30.   
  31.     </properties>  
  32.   
  33.     <dependencies>  
  34.         <dependency>  
  35.             <groupId>org.springframework.boot</groupId>  
  36.             <artifactId>spring-boot-starter-data-jpa</artifactId>  
  37.         </dependency>  
  38.         <dependency>  
  39.             <groupId>org.springframework.boot</groupId>  
  40.             <artifactId>spring-boot-starter-security</artifactId>  
  41.         </dependency>  
  42.         <dependency>  
  43.             <groupId>org.projectlombok</groupId>  
  44.             <artifactId>lombok</artifactId>  
  45.         </dependency>  
  46.         <dependency>  
  47.             <groupId>org.springframework.boot</groupId>  
  48.             <artifactId>spring-boot-starter-web</artifactId>  
  49.             <exclusions>  
  50.                 <exclusion>  
  51.                     <groupId>org.springframework.boot</groupId>  
  52.                     <artifactId>spring-boot-starter-tomcat</artifactId>  
  53.                 </exclusion>  
  54.             </exclusions>  
  55.         </dependency>  
  56.         <dependency>  
  57.             <groupId>org.springframework.boot</groupId>  
  58.             <artifactId>spring-boot-starter-undertow</artifactId>  
  59.         </dependency>  
  60.   
  61.         <dependency>  
  62.             <groupId>com.zaxxer</groupId>  
  63.             <artifactId>HikariCP</artifactId>  
  64.             <version>${hikaricp.version}</version>  
  65.         </dependency>  
  66.   
  67.         <dependency>  
  68.             <groupId>com.google.guava</groupId>  
  69.             <artifactId>guava</artifactId>  
  70.             <version>21.0</version>  
  71.         </dependency>  
  72.   
  73.         <dependency>  
  74.             <groupId>io.jsonwebtoken</groupId>  
  75.             <artifactId>jjwt</artifactId>  
  76.             <version>${jjwt.version}</version>  
  77.         </dependency>  
  78.   
  79.         <dependency>  
  80.             <groupId>mysql</groupId>  
  81.             <artifactId>mysql-connector-java</artifactId>  
  82.             <scope>runtime</scope>  
  83.         </dependency>  
  84.   
  85.         <dependency>  
  86.             <groupId>org.springframework.boot</groupId>  
  87.             <artifactId>spring-boot-starter-test</artifactId>  
  88.             <scope>test</scope>  
  89.         </dependency>  
  90.         <dependency>  
  91.             <groupId>com.h2database</groupId>  
  92.             <artifactId>h2</artifactId>  
  93.             <version>1.4.194</version>  
  94.             <scope>test</scope>  
  95.         </dependency>  
  96.         <dependency>  
  97.             <groupId>net.serenity-bdd</groupId>  
  98.             <artifactId>serenity-core</artifactId>  
  99.             <version>${serenity.version}</version>  
  100.             <scope>test</scope>  
  101.         </dependency>  
  102.         <dependency>  
  103.             <groupId>net.serenity-bdd</groupId>  
  104.             <artifactId>serenity-junit</artifactId>  
  105.             <version>${serenity.version}</version>  
  106.             <scope>test</scope>  
  107.         </dependency>  
  108.         <dependency>  
  109.             <groupId>net.serenity-bdd</groupId>  
  110.             <artifactId>serenity-jbehave</artifactId>  
  111.             <version>${serenity.jbehave.version}</version>  
  112.             <scope>test</scope>  
  113.         </dependency>  
  114.         <dependency>  
  115.             <groupId>net.serenity-bdd</groupId>  
  116.             <artifactId>serenity-rest-assured</artifactId>  
  117.             <version>${serenity.version}</version>  
  118.             <scope>test</scope>  
  119.         </dependency>  
  120.         <dependency>  
  121.             <groupId>io.rest-assured</groupId>  
  122.             <artifactId>spring-mock-mvc</artifactId>  
  123.             <version>${rest-assured.version}</version>  
  124.             <scope>test</scope>  
  125.         </dependency>  
  126.         <dependency>  
  127.             <groupId>net.serenity-bdd</groupId>  
  128.             <artifactId>serenity-spring</artifactId>  
  129.             <version>${serenity.version}</version>  
  130.             <scope>test</scope>  
  131.         </dependency>  
  132.         <dependency>  
  133.             <groupId>org.apache.commons</groupId>  
  134.             <artifactId>commons-lang3</artifactId>  
  135.             <version>3.6</version>  
  136.         </dependency>  
  137.         <dependency>  
  138.             <groupId>junit</groupId>  
  139.             <artifactId>junit</artifactId>  
  140.             <version>3.8.1</version>  
  141.             <scope>test</scope>  
  142.         </dependency>  
  143.         <dependency>  
  144.             <groupId>com.google.code.gson</groupId>  
  145.             <artifactId>gson</artifactId>  
  146.         </dependency>  
  147.         <dependency>  
  148.             <groupId>com.alibaba</groupId>  
  149.             <artifactId>dubbo</artifactId>  
  150.             <version>2.5.3</version>  
  151.         </dependency>  
  152.   
  153.         <dependency>  
  154.             <groupId>io.dubbo.springboot</groupId>  
  155.             <artifactId>spring-boot-starter-dubbo</artifactId>  
  156.             <version>1.0.0</version>  
  157.         </dependency>  
  158.   
  159.   
  160.         <dependency>  
  161.             <groupId>org.codehaus.groovy</groupId>  
  162.             <artifactId>groovy</artifactId>  
  163.         </dependency>  
  164.         <dependency>  
  165.             <groupId>org.codehaus.groovy</groupId>  
  166.             <artifactId>groovy-all</artifactId>  
  167.         </dependency>  
  168.   
  169.         <dependency>  
  170.             <groupId>junit</groupId>  
  171.             <artifactId>junit</artifactId>  
  172.         </dependency>  
  173.         <dependency>  
  174.             <groupId>org.springframework</groupId>  
  175.             <artifactId>spring-test</artifactId>  
  176.             <version>4.3.8.RELEASE</version>  
  177.         </dependency>  
  178.         <dependency>  
  179.             <groupId>org.springframework.boot</groupId>  
  180.             <artifactId>spring-boot-test</artifactId>  
  181.         </dependency>  
  182.         <dependency>  
  183.             <groupId>io.rest-assured</groupId>  
  184.             <artifactId>spring-mock-mvc</artifactId>  
  185.             <version>3.0.3</version>  
  186.         </dependency>  
  187.         <dependency>  
  188.             <groupId>net.serenity-bdd</groupId>  
  189.             <artifactId>serenity-jbehave</artifactId>  
  190.             <version>1.26.0-rc.3</version>  
  191.         </dependency>  
  192.         <dependency>  
  193.             <groupId>net.serenity-bdd</groupId>  
  194.             <artifactId>serenity-core</artifactId>  
  195.             <version>1.4.1-rc.7</version>  
  196.         </dependency>  
  197.         <dependency>  
  198.             <groupId>org.projectlombok</groupId>  
  199.             <artifactId>lombok</artifactId>  
  200.             <version>1.16.14</version>  
  201.         </dependency>  
  202.   
  203.     </dependencies>  
  204.     <build>  
  205.         <finalName>data-share</finalName>  
  206.         <plugins>  
  207.             <plugin>  
  208.                 <groupId>org.apache.maven.plugins</groupId>  
  209.                 <artifactId>maven-compiler-plugin</artifactId>  
  210.                 <configuration>  
  211.                     <source>1.8</source>  
  212.                     <target>1.8</target>  
  213.                 </configuration>  
  214.             </plugin>  
  215.             <plugin>  
  216.                 <groupId>org.springframework.boot</groupId>  
  217.                 <artifactId>spring-boot-maven-plugin</artifactId>  
  218.                 <configuration>  
  219.                     <addResources>true</addResources>  
  220.                 </configuration>  
  221.             </plugin>  
  222.             <plugin>  
  223.                 <groupId>org.apache.maven.plugins</groupId>  
  224.                 <artifactId>maven-surefire-plugin</artifactId>  
  225.                 <version>${maven-surefire-plugin.version}</version>  
  226.                 <configuration>  
  227.                     <testFailureIgnore>true</testFailureIgnore>  
  228.                 </configuration>  
  229.             </plugin>  
  230.             <plugin>  
  231.                 <groupId>net.serenity-bdd.maven.plugins</groupId>  
  232.                 <artifactId>serenity-maven-plugin</artifactId>  
  233.                 <version>${serenity.version}</version>  
  234.                 <executions>  
  235.                     <execution>  
  236.                         <id>serenity-reports</id>  
  237.                         <phase>post-integration-test</phase>  
  238.                         <goals>  
  239.                             <goal>aggregate</goal>  
  240.                         </goals>  
  241.                     </execution>  
  242.                 </executions>  
  243.             </plugin>  
  244.         </plugins>  
  245.     </build>  
  246. </project>  
auth / AuthError.java

[java]  view plain  copy
  1. package com.test.auth;  
  2.   
  3. import com.fasterxml.jackson.databind.ObjectMapper;  
  4. import org.springframework.security.access.AccessDeniedException;  
  5. import org.springframework.security.core.AuthenticationException;  
  6. import org.springframework.security.web.AuthenticationEntryPoint;  
  7. import org.springframework.security.web.access.AccessDeniedHandler;  
  8. import org.springframework.stereotype.Component;  
  9.   
  10. import javax.servlet.ServletException;  
  11. import javax.servlet.http.HttpServletRequest;  
  12. import javax.servlet.http.HttpServletResponse;  
  13. import java.io.IOException;  
  14.   
  15. import static com.test.data.RestResp.fail;  
  16. import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN;  
  17. import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;  
  18.   
  19.   
  20. @Component  
  21. public class AuthError implements AuthenticationEntryPoint, AccessDeniedHandler {  
  22.   
  23.     @Override  
  24.     public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {  
  25.         handleAccessDenied(request, response, authException);  
  26.     }  
  27.   
  28.     private static void handleAccessDenied(HttpServletRequest request, HttpServletResponse response, Exception exception) throws IOException, ServletException {  
  29.         response.setStatus(SC_FORBIDDEN);  
  30.         response.setContentType(APPLICATION_JSON_VALUE);  
  31.   
  32.         String message = "authentication error: ";  
  33.         if (exception.getCause() != null) {  
  34.             message += exception  
  35.                     .getCause()  
  36.                     .getMessage();  
  37.         } else {  
  38.             message += exception.getMessage();  
  39.         }  
  40.         byte[] body = new ObjectMapper().writeValueAsBytes(fail(message));  
  41.         response  
  42.                 .getOutputStream()  
  43.                 .write(body);  
  44.   
  45.     }  
  46.   
  47.     @Override  
  48.     public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException, ServletException {  
  49.         handleAccessDenied(request, response, accessDeniedException);  
  50.     }  
  51. }  

auth /JwtAuthentication.java

[java]  view plain  copy
  1. package com.test.auth;  
  2.   
  3. import com.test.domain.User;  
  4. import org.springframework.security.core.Authentication;  
  5. import org.springframework.security.core.GrantedAuthority;  
  6.   
  7. import java.util.Collection;  
  8. import java.util.Map;  
  9. import java.util.Optional;  
  10.   
  11. import static java.util.Collections.emptyList;  
  12.   
  13.   
  14. public class JwtAuthentication implements Authentication {  
  15.   
  16.     private String token;  
  17.     private User user;  
  18.     private Map<String, Object> details;  
  19.   
  20.     JwtAuthentication(User user, String token, Map<String, Object> details){  
  21.         this.token = token;  
  22.         this.user = user;  
  23.         this.details = details;  
  24.     }  
  25.   
  26.     public Optional<User> user(){  
  27.         return Optional.ofNullable(user);  
  28.     }  
  29.   
  30.   
  31.     @Override  
  32.     public Collection<? extends GrantedAuthority> getAuthorities() {  
  33.         return emptyList();  
  34.     }  
  35.   
  36.     @Override  
  37.     public Object getCredentials() {  
  38.         return token;  
  39.     }  
  40.   
  41.     @Override  
  42.     public Object getDetails() {  
  43.         return details;  
  44.     }  
  45.   
  46.     @Override  
  47.     public Object getPrincipal() {  
  48.         return user;  
  49.     }  
  50.   
  51.     @Override  
  52.     public boolean isAuthenticated() {  
  53.         return user != null && user.getName() != null && user.getMobile() != null;  
  54.     }  
  55.   
  56.     @Override  
  57.     public void setAuthenticated(boolean b) throws IllegalArgumentException {  
  58.         if (!isAuthenticated()){  
  59.             user = null;  
  60.         }  
  61.     }  
  62.   
  63.     @Override  
  64.     public String getName() {  
  65.         return user.getName();  
  66.     }  
  67.   
  68.     @Override  
  69.     public String toString() {  
  70.         return token;  
  71.     }  
  72. }  

auth /JwtAuthenticationProvider.java

[java]  view plain  copy
  1. package com.test.auth;  
  2.   
  3.   
  4. import org.springframework.security.authentication.AuthenticationProvider;  
  5. import org.springframework.security.core.Authentication;  
  6. import org.springframework.security.core.AuthenticationException;  
  7. import org.springframework.stereotype.Component;  
  8.   
  9.   
  10. @Component  
  11. public class JwtAuthenticationProvider implements AuthenticationProvider {  
  12.   
  13.     @Override  
  14.     public Authentication authenticate(Authentication authentication) throws AuthenticationException {  
  15.         if (authentication != null) {  
  16.             authentication.setAuthenticated((authentication.getPrincipal() != null));  
  17.         }  
  18.         return authentication;  
  19.     }  
  20.   
  21.     @Override  
  22.     public boolean supports(Class<?> authentication) {  
  23.         return authentication.isAssignableFrom(JwtAuthentication.class);  
  24.     }  
  25.   
  26. }  

auth /JwtService.java

[java]  view plain  copy
  1. package com.test.auth;  
  2.   
  3. import com.test.data.UserRepo;  
  4. import com.test.domain.User;  
  5.   
  6. import io.jsonwebtoken.Claims;  
  7. import io.jsonwebtoken.Jws;  
  8. import io.jsonwebtoken.SignatureAlgorithm;  
  9. import io.jsonwebtoken.impl.DefaultJwtBuilder;  
  10. import io.jsonwebtoken.impl.DefaultJwtParser;  
  11. import org.slf4j.Logger;  
  12. import org.slf4j.LoggerFactory;  
  13. import org.springframework.beans.factory.annotation.Autowired;  
  14. import org.springframework.beans.factory.annotation.Value;  
  15. import org.springframework.core.io.ClassPathResource;  
  16. import org.springframework.stereotype.Service;  
  17.   
  18. import javax.annotation.PostConstruct;  
  19. import java.security.KeyStore;  
  20. import java.security.PrivateKey;  
  21. import java.security.PublicKey;  
  22. import java.security.cert.CertificateFactory;  
  23. import java.security.cert.X509Certificate;  
  24. import java.security.interfaces.ECPrivateKey;  
  25. import java.time.ZonedDateTime;  
  26. import java.util.Date;  
  27. import java.util.Optional;  
  28. import java.util.UUID;  
  29.   
  30. import static java.util.Optional.empty;  
  31.   
  32.   
  33. @Service  
  34. public class JwtService {  
  35.   
  36.     private Logger LOG = LoggerFactory.getLogger(getClass());  
  37.   
  38.     @Value("${jwt.key.store}"private String keystore;  
  39.     @Value("${jwt.key.pass}"private String keypass;  
  40.     @Value("${jwt.key.alias}"private String keyalias;  
  41.     @Value("${jwt.cert}"private String cert;  
  42.   
  43.     private UserRepo userRepo;  
  44.     private PrivateKey privateKey;  
  45.     private PublicKey publicKey;  
  46.   
  47.     public JwtService(@Autowired UserRepo userRepo){  
  48.         this.userRepo = userRepo;  
  49.     }  
  50.   
  51.     @PostConstruct  
  52.     private void init() throws Exception {  
  53.         char[] pass = keypass.toCharArray();  
  54.         KeyStore from = KeyStore.getInstance("JKS""SUN");  
  55.         from.load(new ClassPathResource(keystore).getInputStream(), pass);  
  56.         privateKey = (ECPrivateKey) from.getKey(keyalias, pass);  
  57.   
  58.         CertificateFactory certificatefactory = CertificateFactory.getInstance("X.509");  
  59.         X509Certificate x509Cert = (X509Certificate) certificatefactory.generateCertificate(new ClassPathResource(cert).getInputStream());  
  60.         publicKey = x509Cert.getPublicKey();  
  61.     }  
  62.   
  63.     public String generate(User user){  
  64.         return new DefaultJwtBuilder()  
  65.                 .setId(UUID.randomUUID().toString())  
  66.                 .setSubject(user.getName())  
  67.                 .setExpiration(Date.from(ZonedDateTime.now().plusWeeks(1).toInstant()))  
  68.                 .signWith(SignatureAlgorithm.ES256, privateKey).compact();  
  69.     }  
  70.   
  71.     Optional<JwtAuthentication> parse(String token){  
  72.         try {  
  73.             Jws<Claims> jws = new DefaultJwtParser().setSigningKey(publicKey).parseClaimsJws(token);  
  74.             Claims claims = jws.getBody();  
  75.             return userRepo.findByName(claims.getSubject()).map(u -> new JwtAuthentication(u, token, claims));  
  76.         }catch (Exception e){  
  77.             LOG.error("failed to parse jwt token {}", token, e);  
  78.         }  
  79.         return empty();  
  80.     }  
  81. }  

auth /JwtTokenFilter.java

[java]  view plain  copy
  1. package com.test.auth;  
  2.   
  3. import org.springframework.beans.factory.annotation.Autowired;  
  4. import org.springframework.security.core.context.SecurityContextHolder;  
  5. import org.springframework.stereotype.Component;  
  6.   
  7. import javax.annotation.Resource;  
  8. import javax.servlet.*;  
  9. import javax.servlet.http.HttpServletRequest;  
  10. import java.io.IOException;  
  11.   
  12.   
  13. @Component  
  14. public class JwtTokenFilter implements Filter {  
  15.   
  16.     private JwtService jwtService;  
  17.   
  18.     public JwtTokenFilter(@Autowired JwtService jwtService){  
  19.         this.jwtService = jwtService;  
  20.     }  
  21.   
  22.     @Override  
  23.     public void init(FilterConfig filterConfig) throws ServletException {  
  24.     }  
  25.   
  26.     @Override  
  27.     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {  
  28.         HttpServletRequest servletRequest = (HttpServletRequest) request;  
  29.         String authorization = servletRequest.getHeader("Authorization");  
  30.         if (authorization != null && authorization.startsWith("Bearer ")) {  
  31.             jwtService  
  32.               .parse(authorization.replaceAll("Bearer """))  
  33.               .ifPresent(jwtAuthentication -> SecurityContextHolder  
  34.                 .getContext()  
  35.                 .setAuthentication(jwtAuthentication));  
  36.         }  
  37.         chain.doFilter(request, response);  
  38.     }  
  39.   
  40.     @Override  
  41.     public void destroy() {  
  42.     }  
  43. }  

data / RestResp.java

[java]  view plain  copy
  1. package com.test.data;  
  2.   
  3.   
  4. public class RestResp {  
  5.   
  6.     public final int status;  
  7.     public final String message;  
  8.     public final Object data;  
  9.   
  10.     private RestResp(int status, String message, Object data) {  
  11.         this.status = status;  
  12.         this.message = message;  
  13.         this.data = data;  
  14.     }  
  15.   
  16.     private RestResp(int status, String messsage) {  
  17.         this(status, messsage, null);  
  18.     }  
  19.   
  20.     public static RestResp success(Object data) {  
  21.         return new RestResp(1"success", data);  
  22.     }  
  23.   
  24.     public static RestResp success(String message, Object data){  
  25.         return new RestResp(1, message, data);  
  26.     }  
  27.   
  28.     public static RestResp fail(String message, Object data){  
  29.         return new RestResp(-1, message, data);  
  30.     }  
  31.   
  32.     public static RestResp fail(String message){  
  33.         return new RestResp(-1, message);  
  34.     }  
  35.   
  36.     public static RestResp fail(){  
  37.         return new RestResp(-1"fail");  
  38.     }  
  39.   
  40. }  

data /UserRepo.java

[java]  view plain  copy
  1. package com.test.data;  
  2.   
  3. import com.test.domain.User;  
  4. import org.springframework.data.repository.CrudRepository;  
  5. import org.springframework.stereotype.Component;  
  6. import org.springframework.stereotype.Repository;  
  7.   
  8. import java.util.Optional;  
  9.   
  10. /** 
  11.  * Created by Luo_xuri on 2017/9/29. 
  12.  */  
  13. @Repository  
  14. public interface UserRepo extends CrudRepository<User, Long> {  
  15.   
  16.     Optional<User> findByName(String userName);  
  17.     Optional<User> findByNameAndPassword(String userName, String password);  
  18. }  
data /UserTokenRepo.java

[java]  view plain  copy
  1. package com.test.data;  
  2.   
  3. import com.test.domain.UserToken;  
  4. import org.springframework.data.repository.CrudRepository;  
  5. import org.springframework.stereotype.Repository;  
  6.   
  7.   
  8. @Repository  
  9. public interface UserTokenRepo extends CrudRepository<UserToken, String> {  
  10. }  

domain / NameAndPass.java

[java]  view plain  copy
  1. package com.test.domain;  
  2.   
  3. /** 
  4.  * Created by Luo_xuri on 2017/9/30. 
  5.  */  
  6. public class NameAndPass {  
  7.   
  8.     private String username;  
  9.     private String password;  
  10.   
  11.     public void setUsername(String username) {  
  12.         this.username = username;  
  13.     }  
  14.   
  15.     public String getUsername() {  
  16.         return username;  
  17.     }  
  18.   
  19.     public void setPassword(String password) {  
  20.         this.password = password;  
  21.     }  
  22.   
  23.     public String getPassword() {  
  24.         return password;  
  25.     }  
  26. }  

domain /User.java

[java]  view plain  copy
  1. package com.test.domain;  
  2.   
  3. import com.fasterxml.jackson.annotation.JsonIgnore;  
  4.   
  5. import javax.persistence.*;  
  6. import java.util.HashSet;  
  7. import java.util.Set;  
  8.   
  9.   
  10. @Entity  
  11. @Table(name = "user", uniqueConstraints = @UniqueConstraint(columnNames = {"name"})) // 唯一约束name  
  12. public class User {  
  13.   
  14.     @Id  
  15.     @GeneratedValue(strategy = GenerationType.AUTO)  
  16.     private Long id;  
  17.   
  18.     private String mobile;  
  19.     private String password;  
  20.   
  21.     private String name;  
  22.   
  23.     @JsonIgnore  
  24.     @Transient  
  25.     private Set<String> authorities = new HashSet<>();  
  26.   
  27.     public User() {  
  28.     }  
  29.   
  30.     public User(String phone, String password) {  
  31.         this.mobile = phone;  
  32.         this.password = password;  
  33.     }  
  34.   
  35.     public Long getId() {  
  36.         return id;  
  37.     }  
  38.   
  39.     public void setId(Long id) {  
  40.         this.id = id;  
  41.     }  
  42.   
  43.     public void setAuthorities(Set<String> authorities) {  
  44.         this.authorities = authorities;  
  45.     }  
  46.   
  47.     public Set<String> getAuthorities() {  
  48.         return authorities;  
  49.     }  
  50.   
  51.     public String getName() {  
  52.         return name;  
  53.     }  
  54.   
  55.     public void setName(String name) {  
  56.         this.name = name;  
  57.     }  
  58.   
  59.     public String getMobile() {  
  60.         return mobile;  
  61.     }  
  62.   
  63.     public void setMobile(String mobile) {  
  64.         this.mobile = mobile;  
  65.     }  
  66.   
  67.     public String getPassword() {  
  68.         return password;  
  69.     }  
  70.   
  71.     public void setPassword(String password) {  
  72.         this.password = password;  
  73.     }  
  74.   
  75.     public String toString() {  
  76.         return String.format("%s(%s)", name, mobile);  
  77.     }  
  78.   
  79. }  

domain /UserToken.java

[java]  view plain  copy
  1. package com.test.domain;  
  2.   
  3. import com.fasterxml.jackson.annotation.JsonFormat;  
  4. import com.fasterxml.jackson.annotation.JsonIgnore;  
  5. import lombok.Data;  
  6. import lombok.NoArgsConstructor;  
  7.   
  8. import javax.annotation.sql.DataSourceDefinition;  
  9. import javax.persistence.*;  
  10. import java.util.Date;  
  11.   
  12.   
  13. @Entity  
  14. @Table(name = "user_token")  
  15. @Data  
  16. @NoArgsConstructor  
  17. public class UserToken {  
  18.   
  19.     @JsonIgnore  
  20.     @Id  
  21.     @GeneratedValue(strategy = GenerationType.AUTO)  
  22.     private Long id;  
  23.   
  24.     @Column(length = 512)  
  25.     private String token;  
  26.   
  27.     @JsonFormat(pattern = "yy-MM-dd hh:mm:ss")  
  28.     private Date createtime = new Date();  
  29.   
  30.     public UserToken(String token){  
  31.         this.token = token;  
  32.     }  
  33. }  

rest / TokenController.java

[java]  view plain  copy
  1. package com.test.rest;  
  2.   
  3. import com.test.auth.JwtService;  
  4. import com.test.data.RestResp;  
  5. import com.test.data.UserRepo;  
  6. import com.test.data.UserTokenRepo;  
  7. import com.test.domain.NameAndPass;  
  8. import com.test.domain.UserToken;  
  9. import lombok.extern.slf4j.Slf4j;  
  10. import org.springframework.web.bind.annotation.PostMapping;  
  11. import org.springframework.web.bind.annotation.RequestBody;  
  12. import org.springframework.web.bind.annotation.RequestMapping;  
  13. import org.springframework.web.bind.annotation.RestController;  
  14.   
  15. import javax.annotation.Resource;  
  16.   
  17.   
  18. @Slf4j  
  19. @RestController  
  20. @RequestMapping("/token")  
  21. public class TokenController {  
  22.   
  23.   
  24.     @Resource  
  25.     private UserRepo userRepo;  
  26.     @Resource  
  27.     private JwtService jwtService;  
  28.     @Resource  
  29.     private UserTokenRepo userTokenRepo;  
  30.   
  31.     @PostMapping  
  32.     public RestResp enroll(@RequestBody NameAndPass user){  
  33.         return userRepo.findByNameAndPassword(user.getUsername(), user.getPassword()).map(u -> {  
  34.            UserToken userToken = new UserToken(jwtService.generate(u));  
  35.            log.info("{} enrolled", user.getUsername());  
  36.            userToken = userTokenRepo.save(userToken);  
  37.            return RestResp.success(userToken);  
  38.         }).orElse(RestResp.fail());  
  39.   
  40.     }  
  41. }  

rest /UserController.java

[java]  view plain  copy
  1. package com.test.rest;  
  2.   
  3. import com.test.data.RestResp;  
  4. import com.test.data.UserRepo;  
  5. import com.test.domain.User;  
  6. import org.slf4j.Logger;  
  7. import org.slf4j.LoggerFactory;  
  8. import org.springframework.web.bind.annotation.PostMapping;  
  9. import org.springframework.web.bind.annotation.RequestBody;  
  10. import org.springframework.web.bind.annotation.RequestMapping;  
  11. import org.springframework.web.bind.annotation.RestController;  
  12.   
  13. import javax.annotation.Resource;  
  14. import java.util.Optional;  
  15.   
  16.   
  17. @RestController  
  18. @RequestMapping("/user")  
  19. public class UserController {  
  20.   
  21.     private Logger LOG = LoggerFactory.getLogger(getClass());  
  22.   
  23.     @Resource  
  24.     private UserRepo userRepo;  
  25.   
  26.     @PostMapping("/register")  
  27.     public RestResp register(@RequestBody User user){  
  28.         return userRepo.findByName(user.getName()).map(u -> RestResp.fail()).orElseGet(() -> {  
  29.            User u = userRepo.save(user);  
  30.            LOG.info("{} registered", u);  
  31.            return RestResp.success("注册成功");  
  32.         });  
  33.     }  
  34. }  

AppConfiguration.java

[java]  view plain  copy
  1. package com.test;  
  2.   
  3. import com.test.auth.AuthError;  
  4. import com.test.auth.JwtAuthenticationProvider;  
  5. import com.test.auth.JwtTokenFilter;  
  6. import org.springframework.beans.factory.annotation.Configurable;  
  7. import org.springframework.context.annotation.Bean;  
  8. import org.springframework.http.HttpMethod;  
  9. import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;  
  10. import org.springframework.security.config.annotation.web.builders.HttpSecurity;  
  11. import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;  
  12. import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;  
  13. import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;  
  14. import org.springframework.web.servlet.config.annotation.CorsRegistry;  
  15. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;  
  16. import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;  
  17.   
  18. import javax.annotation.Resource;  
  19.   
  20. import static org.springframework.http.HttpMethod.POST;  
  21.   
  22.   
  23. @EnableWebSecurity  
  24. @Configurable  
  25. public class AppConfiguration extends WebSecurityConfigurerAdapter {  
  26.   
  27.     @Resource  
  28.     private JwtTokenFilter jwtTokenFilter;  
  29.   
  30.     @Resource  
  31.     private JwtAuthenticationProvider jwtAuthenticationProvider;  
  32.   
  33.     @Resource  
  34.     private AuthError authError;  
  35.   
  36.     @Override  
  37.     protected void configure(HttpSecurity http) throws Exception {  
  38.         http  
  39.                 .cors()  
  40.                 .and()  
  41.                 .csrf()  
  42.                 .disable()  
  43.                 .authorizeRequests()  
  44.                 .antMatchers(POST ,"/user/register""/token"// 不拦截  
  45.                 .permitAll().antMatchers("/**/*"// 允许拦截  
  46.                 .authenticated()  
  47.                 .and()  
  48.                 .addFilterBefore(jwtTokenFilter, UsernamePasswordAuthenticationFilter.class)  
  49.                 .exceptionHandling()  
  50.                 .authenticationEntryPoint(authError)  
  51.                 .accessDeniedHandler(authError);  
  52.     }  
  53.   
  54.     @Override  
  55.     protected void configure(AuthenticationManagerBuilder auth) throws Exception {  
  56.         auth.authenticationProvider(jwtAuthenticationProvider);  
  57.     }  
  58.   
  59.     /** 
  60.      * allow cross origin requests 
  61.      * 跨域相关,请百度 
  62.      */  
  63.     @Bean  
  64.     public WebMvcConfigurer corsConfigurer() {  
  65.         return new WebMvcConfigurerAdapter() {  
  66.             @Override  
  67.             public void addCorsMappings(CorsRegistry registry) {  
  68.                 registry  
  69.                         .addMapping("/**")  
  70.                         .allowedOrigins("*")  
  71.                         .allowedMethods("GET""POST""PUT""OPTIONS""DELETE")  
  72.                         .allowedHeaders("*");  
  73.             }  
  74.         };  
  75.     }  
  76. }  

Application.java

[java]  view plain  copy
  1. package com.test;  
  2.   
  3. import org.springframework.boot.SpringApplication;  
  4. import org.springframework.boot.autoconfigure.SpringBootApplication;  
  5. import org.springframework.scheduling.annotation.EnableScheduling;  
  6.   
  7. @SpringBootApplication  
  8. @EnableScheduling  
  9. public class Application {  
  10.   
  11.     public static void main(String[] args) {  
  12.         SpringApplication.run(Application.class, args);  
  13.     }  
  14. }  

resources/ security   # 这是文件夹
oxcc.cer
oxcc.jks
上面两个是什么鬼,如果你不知道就百度一下
[java]  view plain  copy
  1. spring.freemarker.enabled=false  
  2. spring.freemarker.checkTemplateLocation=false  
  3.   
  4. server.port=8686  
  5.   
  6. spring.datasource.url=jdbc:mysql://localhost:3306/logindemo?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull  
  7. spring.datasource.username=root  
  8. spring.datasource.password=root  
  9. spring.datasource.driver-class-name=com.mysql.jdbc.Driver  
  10.   
  11. spring.datasource.hikari.connection-timeout=3000  
  12. spring.datasource.hikari.initialization-fail-fast=true  
  13. spring.datasource.hikari.max-lifetime=600000  
  14. spring.datasource.hikari.maximum-pool-size=5  
  15. spring.datasource.hikari.minimum-idle=20000  
  16. spring.datasource.hikari.idle-timeout=300000  
  17.   
  18. spring.jpa.hibernate.ddl-auto=update  
  19. spring.jpa.show-sql=false  
  20.   
  21. jwt.key.store=security/oxcc.jks  
  22. jwt.key.pass=test  
  23. jwt.key.alias=oxkey-cc  
  24. jwt.cert=security/oxcc.cer  

代码直接复制粘贴,可用于生产环境的注册登录就这么简单的完成了!
如果觉得还可以,请点赞!


猜你喜欢

转载自blog.csdn.net/chrise_/article/details/80389480