Tabla de contenido
2. Inicio rápido basado en el módulo de administrador SpringSecurity
2.0 Primero introduce las dependencias
2.1 Heredar WebSecurityConfiuraerAdapter
3. Inicio rápido basado en el módulo de usuario común SpringSecurity
3.0. Introduciendo dependencias
3.1 Implementar la interfaz UserDetailsService
3.2 Heredar WebSecurityconfiguraerAdapter
Introducción
SpringSecurity está integrado en SpringBoot 2.3.4.RELEASE, por lo que solo necesitamos introducir dependencias de inicio.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Inicio rápido
El inicio rápido del uso de SpringSecurity se divide en dos pasos, porque en el proceso de redacción de proyectos en la empresa, se divide en front-end y back-end. Cuando se utiliza el inicio de sesión en el back-end, no es necesario realizar consultas. la base de datos, porque el inicio de sesión de back-end está controlado por el administrador y la administración Solo se necesitan de 1 a 5 miembros. Necesitamos consultar la base de datos en la recepción, por lo que dividiré el inicio rápido en dos módulos, uno es el módulo de fondo y el otro es el módulo de recepción.
2. Inicio rápido basado en el módulo de administrador SpringSecurity
2.0 Primero introduce las dependencias
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2.1 Heredar WebSecurityConfiuraerAdapter
WebSecurityConfigurerAdaptador
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
String password = passwordEncoder().encode("密码");
auth.inMemoryAuthentication().withUser("账号").password(password).roles("");
}
//引入security自带的密码加密
@Bean
PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
//配置认证
http.formLogin().loginPage("/login.html")//配置那个url为登录页面
.loginProcessingUrl("/login")//设置那个是登录的url
.defaultSuccessUrl("/admin/index.html").permitAll()//登录成功去哪?
.failureForwardUrl("/find.html").permitAll()//登录失败去哪?
//退出时删除缓存,并且重定向到login.html页面 在前端默认路径为:/logout .and().requestCache().disable().logout().logoutSuccessUrl("/login.html").permitAll();
//开启frame功能
http.headers().frameOptions().sameOrigin();
//这个可以根据自己需求去添加
http.authorizeRequests().antMatchers(
"/css/**",
"/*.html",
"/img/**",
"/js/**",
"/login",
"/plugins/**"
).permitAll()//制定URL无需保护。
.anyRequest() //其他请求
.authenticated();//需要认证
//关闭csrf跨域
http.csrf().disable();
}
}
2.2 Página de inicio
<form action="/login"method="post">
用户名:<input type="text"name="username"/><br/>
密码:<input type="password"name="password"/><br/>
<input type="submit"value="提交"/>
</form>
Nota: se debe llamar al nombre: el método de nombre de usuario y contraseña debe enviarse para la acción posterior : /login
Una vez completada la configuración, puede iniciar el proyecto y comenzar a probar. No importa a qué acceda, la página de inicio de sesión que especificó será predeterminada. ¡Solo después de iniciar sesión exitosamente podrá acceder a otras páginas!
3. Inicio rápido basado en el módulo de usuario común SpringSecurity
3.0. Introduciendo dependencias
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
3.1 Implementar la interfaz UserDetailsService
@Service("userDetailsService")
public class MyUserDetailsService implements UserDetailsService {
/**
因为公司项目使用的是Dubbo+zookeeper组合,所以我调用的接口在zookeeper中使用这个注解
如果你使用的是单项目的话可以直接通过spring注入的方式,来获取你的mapper接口!
*/
@Reference(version = "1.0.0")
SellerService sellerService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//给当前用户创建权限 可自定义 默认就为这个
List<GrantedAuthority> auths = AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_SELLER");
//通过前端传入的参数获取username,在数据库中查询出来数据
Seller seller = sellerService.findOne(username);
//这个是判断用户的状态,如果没有状态,你只需要判断是否为空即可
if (seller!=null && "1".equals(seller.getStatus())){
return new User(seller.getSellerId(),new BCryptPasswordEncoder().encode(seller.getPassword()),auths);
}else {
throw new UsernameNotFoundException("用户名不存在");
}
}
}
3.2 Heredar WebSecurityconfiguraerAdapter
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
UserDetailsService userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
//通过数据库查询出来判断账号密码是否相等
auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
}
//注入security自带的加密方式
@Bean
PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
//配置认证
http.formLogin().loginPage("/shoplogin.html")//配置那个url为登录页面
.loginProcessingUrl("/login")//设置那个是登录的url
.defaultSuccessUrl("/admin/index.html").permitAll()//登录成功去哪?
.failureForwardUrl("/shoplogin.html").permitAll()//登录失败去哪?
.and().requestCache().disable().logout().logoutSuccessUrl("/login.html").permitAll();
// 解析前端的 <frame>、<iframe> 标签
http.headers().frameOptions().sameOrigin();
//设置无需保护的路径
http.authorizeRequests().antMatchers(
"/css/**",
"/img/**",
"/js/**",
"/login",
"/plugins/**",
"/seller/addSeller",
"/*.html"
).permitAll()//制定URL无需保护。
.anyRequest() //其他请求
.authenticated();//需要认证
//关闭跨域
http.csrf().disable();
}
}
Esta imagen es el contenido del código anterior y puede ignorarse.
3.3 Página de inicio
<form action="/login"method="post">
用户名:<input type="text"name="username"/><br/>
密码:<input type="password"name="password"/><br/>
<input type="submit"value="提交"/>
</form>
3.4 Obtener el nombre de usuario gestionado por Seguridad
@RequestMapping("/name")
public Map<String,String> name(){
//获取被Security管理的username
String name= SecurityContextHolder.getContext().getAuthentication().getName();
//将他保存到map等其他类型中就可以传到前端页面或者通过这个名字查询数据库
Map<String, String> map = new HashMap<>();
map.put("loginName",name);
return map;
}
Listo para la prueba
Cadena de solicitudes:
Cuando iniciamos el proyecto, el método configure(HttpSecurity http) en 3.2 se cargará automáticamente. Luego, cuando ingresemos a la página de inicio de sesión y enviemos los datos de la solicitud de publicación a /login mediante el nombre de usuario y la contraseña, ingresaremos loadUserByUsername (String nombre de usuario) método en 3.1 . Para juzgar entre sus bases de datos, una vez completado el juicio, ingresará el método configure(AuthenticationManagerBuilder auth) en 3.2 y dejará que Seguridad se encargue de si el inicio de sesión es exitoso.