这是spring boot框架下的登录注册功能,并且带有token验证,可以用于生产环境的实例
原理太简单,直接上代码,让你知道什么叫拿来主义!!

1,java中项目介绍

2,resources 中的内容

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

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

auth / AuthError.java

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

auth /JwtAuthentication.java

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

auth /JwtAuthenticationProvider.java

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

auth /JwtService.java

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

auth /JwtTokenFilter.java

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

data / RestResp.java

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

data /UserRepo.java

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

data /UserTokenRepo.java

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

domain / NameAndPass.java

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

domain /User.java

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

domain /UserToken.java

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

rest / TokenController.java

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

rest /UserController.java

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

AppConfiguration.java

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

Application.java

[java]  view plain copy
  1. package com.test;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.scheduling.annotation.EnableScheduling;
  5. @SpringBootApplication
  6. @EnableScheduling
  7. public class Application {
  8. public static void main(String[] args) {
  9. SpringApplication.run(Application.class, args);
  10. }
  11. }
resources/ security   # 这是文件夹
oxcc.cer
oxcc.jks
上面两个是什么鬼,如果你不知道就百度一下
resources/ application.properties
[java]  view plain copy
  1. spring.freemarker.enabled=false
  2. spring.freemarker.checkTemplateLocation=false
  3. server.port=8686
  4. spring.datasource.url=jdbc:mysql://localhost:3306/logindemo?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
  5. spring.datasource.username=root
  6. spring.datasource.password=root
  7. spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  8. spring.datasource.hikari.connection-timeout=3000
  9. spring.datasource.hikari.initialization-fail-fast=true
  10. spring.datasource.hikari.max-lifetime=600000
  11. spring.datasource.hikari.maximum-pool-size=5
  12. spring.datasource.hikari.minimum-idle=20000
  13. spring.datasource.hikari.idle-timeout=300000
  14. spring.jpa.hibernate.ddl-auto=update
  15. spring.jpa.show-sql=false
  16. jwt.key.store=security/oxcc.jks
  17. jwt.key.pass=test
  18. jwt.key.alias=oxkey-cc
  19. jwt.cert=security/oxcc.cer

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

10分钟搞定Java带token验证的注册登录相关推荐

  1. 10分钟搞定 Java 并发队列

    前言 如果按照用途与特性进行粗略的划分,JUC 包中包含的工具大体可以分为 6 类: 执行者与线程池 并发队列 同步工具 并发集合 锁 原子变量 在[并发系列]中,主要讲解了 执行者与线程池,同步工具 ...

  2. 10分钟搞定 Java 并发队列好吗?好的

    前言 如果按照用途与特性进行粗略的划分,JUC 包中包含的工具大体可以分为 6 类: 执行者与线程池 并发队列 同步工具 并发集合 锁 原子变量 在[并发系列]中,主要讲解了 执行者与线程池,同步工具 ...

  3. 视频教程-10分钟搞定 php+H5手机网页微信支付 在线视频教程(含源代码)-微信开发

    10分钟搞定 php+H5手机网页微信支付 在线视频教程(含源代码) 04年进入计算机行业.拥有6年net和php项目开发经验,8年java项目开发经验. 现前端全栈工程师,主攻产品设计,微信开发等. ...

  4. 风控必备的评分卡模型,TempoAI 10分钟搞定

    8月20日,央行发布了<2020年第二季度支付体系运行总体情况>,数据显示,截至第二季度末,信用卡逾期半年未偿信贷总额838.84亿元,占信用卡应偿信贷余额的1.17%.与一季度相比,信用 ...

  5. w ndows 10画图,网友“羞辱”Windows 10界面设计:用画图 10分钟搞定!

    原标题:网友"羞辱"Windows 10界面设计:用画图 10分钟搞定! Windows 10是个好系统,但是UI界面设计一直有不小的争议.微软试图全面扁平化,但很多时候仿佛只是为 ...

  6. 三步10分钟搞定数据库版本的降迁 (将后台数据库SQL2008R2降为SQL2005版本)

    三步10分钟搞定数据库版本的降迁 (将SQL2008R2降为SQL2005版本) 转载原文,并注明出处!虽无多少技术含量,毕竟是作者心血原创,希望理解. 转自 http://blog.csdn.net ...

  7. mysql降低数据库版本_三步10分钟搞定数据库版本的降迁 (将后台数据库SQL2008R2降为SQ...

    三步10分钟搞定数据库版本的降迁 (将SQL2008R2降为SQL2005版本) 前思后想仍觉得实战数据库版本的降迁一文中的方式不仅老土而且低效,故有了下文三步搞定数据库从MSSQL2008R2 高版 ...

  8. 10分钟搞定miniconda-python环境安装

    windows配置python环境 每次到一个新电脑就要安装环境,很多包安装起来很麻烦,下面对安装地址和常规使用包做了总结,一键安装所有包不用再一个一个找了!所有问题10分钟搞定! 1. 安装Mini ...

  9. 10分钟搞定win11安卓子系统

    10分钟搞定win11安卓子系统 Android子系统的要求 一.安装 Windows 虚拟化支持 二.Win11 正式版安装安卓子系统方法教程 (离线包安装) 三.在Win11 安卓子系统安装 AP ...

最新文章

  1. Kali Linux python 安装pip
  2. python爬取站长素材网页图片保存到ppt中
  3. urlrewrite实现之HTTP 运行库支持
  4. 老板和主管不懂SEO,乱给SEO人员下指令怎么办?
  5. MySQL分页查询小技巧
  6. IOS初始化控制器的两种方法
  7. 罗格斯的计算机科学,Rutgers的CS「罗格斯大学计算机科学系」
  8. 利用计算机绘制地质图的思路和方法,基于平面地质图的三维地质建模方法研究...
  9. 腾讯内容开放平台:将重拳打击盗号 严重违法行为将报送国家执法部门
  10. Linux命令之xargs命令详解
  11. 【短文本聚类】TextCluster:短文本聚类预处理模块 Short text cluster
  12. 剑指offer-刷题总结
  13. python实现排列组合问题
  14. 张宝杰:将IT创造价值进行到底的秘诀
  15. 应用市场免费推广资源合集
  16. github 镜像站
  17. 惠普暗影精灵4pro安装ubuntu16.04
  18. 实现Mac窗口最小化动画效果
  19. 本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止.
  20. 帮北航小妹妹做的一道她的C++的作业题.

热门文章

  1. APP开发之apicloud(一)
  2. 【skLearn 回归模型】岭回归 <linear_model.Ridge>
  3. 【Linux】【Kernel】BUG: scheduling while atomic问题分析
  4. 【if 的高阶用法练习题】if only / I wish
  5. 如何生成Patch及打patch
  6. 删除win10系统默认微软输入法
  7. 严格模式和普通模式的区别
  8. Vue3.0的插槽是如何实现的?
  9. 接口测试用例设计的一点总结
  10. java读取word文档的复杂表格_poi读取word表格 java POI 如何读取word的表格中的表格...