导包pom.xml
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>${security.version}</version>
</dependency>
MyConfig.java
package com.neuedu.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@Configuration
public class MyConfig {
@Bean
BCryptPasswordEncoder bCryptPasswordEncoder(){
return new BCryptPasswordEncoder();
}
}
SecurityConfig.java
package com.neuedu.security;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import javax.annotation.Resource;
@Configuration
//如何配置spring-security呢?首先建立一个类,放进ioc容器,
// 并且必须继承WebSecurityConfigurerAdapter
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Resource
RestNoToken restNoToken;
@Resource
JWTAuthentication jwtAuthentication;
//必须重写configurer方法
@Override
protected void configure(HttpSecurity http) throws Exception {
ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry
registry = http.authorizeRequests();
//这句话的意思是除了/index不需要身份验证,其余都需要身份验证,其中antMatchers里面
//的参数可以写多个,配置不用认证的地址
registry.antMatchers("/index")
.permitAll()
.anyRequest()
.authenticated();
//前后分离的话就是把下面的配置一下,关闭session
registry.and()
.csrf()
.disable()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
//自定义没有认证返回什么东西,如果自定义没有权限的返回内容,就必须自己写个类
//自定义没有认证返回的内容
registry.and()
.exceptionHandling()
.authenticationEntryPoint(restNoToken);
//下一步是怎么才能让他有认证
//如果自定义认证方式,必须自己写一个类,
// 实际上是一个过滤器,必须继承一个父类
//自定义验证
registry.and()
.addFilterBefore(jwtAuthentication, UsernamePasswordAuthenticationFilter.class);
}
}
RestNotoken.java
package com.neuedu.security;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.stereotype.Component;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
public class RestNoToken implements AuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
httpServletResponse.setHeader("Access-Control-Allow-Origin","*");
httpServletResponse.setCharacterEncoding("utf-8");
httpServletResponse.setContentType("text/html;charset=utf-8");
httpServletResponse.getWriter().write("NoToken");
}
}
JWTAuthentication.java
package com.neuedu.security;
import com.neuedu.pojo.UmsUser;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
//和过滤器很像啊
//这个写好后方进入ioc容器
@Component
public class JWTAuthentication extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
//生产一个umsUser对象
UmsUser umsUser = new UmsUser();
umsUser.setUsername("admin");
umsUser.setPassword("1234");
UserDetails userDetails = new UmsUserDetails(umsUser);
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(userDetails,null,userDetails.getAuthorities());
//有这句就表示有身份认证*********
SecurityContextHolder.getContext().setAuthentication(token);
filterChain.doFilter(httpServletRequest,httpServletResponse);
}
}
UmsUserDetails.java
package com.neuedu.security;
import com.neuedu.pojo.UmsUser;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UmsUserDetails implements UserDetails {
private UmsUser umsUser;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
}
//用户信息
@Override
public String getPassword() {
return umsUser.getPassword();
}
@Override
public String getUsername() {
return umsUser.getUsername();
}
//这几个是 是否已经失效了
@Override
public boolean isAccountNonExpired() {
return false;
}
@Override
public boolean isAccountNonLocked() {
return false;
}
@Override
public boolean isCredentialsNonExpired() {
return false;
}
@Override
public boolean isEnabled() {
return false;
}
}
mybatis-plus模板**********
package test;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import java.util.ArrayList;
import java.util.List;
public class AutoCodeplus {
public static void main(String[] args) {
// 代码生成器
AutoGenerator mpg = new AutoGenerator();
// 全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");
gc.setOutputDir(projectPath + "/src/main/java");//生成的具体位置
gc.setAuthor("liuyong");//所有者
gc.setOpen(false);
// gc.setSwagger2(true); 实体属性 Swagger2 注解
mpg.setGlobalConfig(gc);
// 数据源配置
DataSourceConfig dsc = new DataSourceConfig();
//配置一下连接,读数据库的表
dsc.setUrl("jdbc:mysql://39.99.142.143:3306/db1?useUnicode=true&useSSL=false&characterEncoding=utf8");
// dsc.setSchemaName("public");
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("1234");
mpg.setDataSource(dsc);
// 包配置
PackageConfig pc = new PackageConfig();
//pc.setModuleName(scanner("模块名"));
pc.setParent("com.neuedu");
pc.setEntity("pojo");
pc.setMapper("mapper");
pc.setService("service");
pc.setServiceImpl("service.impl");
pc.setController("controller");
mpg.setPackageInfo(pc);
// 自定义配置
InjectionConfig cfg = new InjectionConfig() {
@Override
public void initMap() {
// to do nothing
}
};
// 如果模板引擎是 freemarker
String templatePath = "/templates/mapper.xml.ftl";
// 如果模板引擎是 velocity
// String templatePath = "/templates/mapper.xml.vm";
// 自定义输出配置
List<FileOutConfig> focList = new ArrayList<>();
// 自定义配置会被优先输出
focList.add(new FileOutConfig(templatePath) {
@Override
public String outputFile(TableInfo tableInfo) {
// 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
return projectPath + "/src/main/resources/com/neuedu/mapper"
+ "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
}
});
/*
cfg.setFileCreate(new IFileCreate() {
@Override
public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
// 判断自定义文件夹是否需要创建
checkDir("调用默认方法创建的目录,自定义目录用");
if (fileType == FileType.MAPPER) {
// 已经生成 mapper 文件判断存在,不想重新生成返回 false
return !new File(filePath).exists();
}
// 允许生成模板文件
return true;
}
});
*/
cfg.setFileOutConfigList(focList);
mpg.setCfg(cfg);
// 配置模板
TemplateConfig templateConfig = new TemplateConfig();
// 配置自定义输出模板
//指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
// templateConfig.setEntity("templates/entity2.java");
// templateConfig.setService();
// templateConfig.setController();
templateConfig.setXml(null);
mpg.setTemplate(templateConfig);
// 策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setNaming(NamingStrategy.underline_to_camel);
strategy.setColumnNaming(NamingStrategy.underline_to_camel);
strategy.setSuperEntityClass("com.neuedu.pojo.BaseEntry");
strategy.setEntityLombokModel(true);
strategy.setRestControllerStyle(true);
// 公共父类
//strategy.setSuperControllerClass("你自己的父类控制器,没有就不用设置!");
// 写于父类中的公共字段
strategy.setSuperEntityColumns("id");
//生成的表名,什么都不写,就给你生成数据库中的所有的表的名字
strategy.setInclude("ums_user");
strategy.setControllerMappingHyphenStyle(true);
strategy.setTablePrefix(pc.getModuleName() + "_");
mpg.setStrategy(strategy);
mpg.setTemplateEngine(new FreemarkerTemplateEngine());
mpg.execute();
}
}
springboot的Mytest测试类
package test;
import com.neuedu.App;
import com.neuedu.pojo.UmsUser;
import com.neuedu.service.IUmsUserService;
import org.jasypt.encryption.StringEncryptor;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.time.LocalDateTime;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = App.class)
public class Mytest {
@Resource
IUmsUserService iUmsUserService;
@Resource
StringEncryptor stringEncryptor;
@Resource
BCryptPasswordEncoder encoder;
@Test
public void handler(){
UmsUser user = new UmsUser(
"abc",
"1234",
LocalDateTime.now(),
1
);
System.out.println(iUmsUserService.saveOrUpdate(user));
}
@Test
public void handlerjasypt(){
//System.out.println(stringEncryptor.encrypt("1234"));//XGHSdlg7WW4jMVKIBQ8u5Q==
System.out.println(stringEncryptor.encrypt("root"));//HspPg+u2KikM9Yb2sUuB5A==
// System.out.println(stringEncryptor.decrypt("XGHSdlg7WW4jMVKIBQ8u5Q=="));
}
@Test
public void handlerList(){
System.out.println(iUmsUserService.list());
}
@Test
public void test(){
System.out.println(encoder.encode("1234"));
//$2a$10$hvQ98K/g0hUwMTaDkORUgO7POhLCpt6TWCi7K6uf2SkuAHWu6fT1S
}
}