Comenzando con SpringSecurity

Este artículo presentará

1. Inicie sesión con la contraseña de cuenta predeterminada SpringSecurity

2. Use el archivo de configuración para configurar el inicio de sesión de cuenta y contraseña

3. Use la clase de configuración para configurar cuentas y establecer permisos

4. Conéctese a la base de datos e inicie sesión con la contraseña de la cuenta de datos en la base de datos

 

1. Cree un proyecto de arranque para importar las dependencias correspondientes

2. Archivo de configuración

spring:
  devtools:
    restart:
      enabled: false  #开启热部署 true
     # additional-paths: src/main/java  #设置重启目录
     # exclude: WEB-INF/** 设置classpath目录下的WEB-INF文件夹内容修改不重启
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8
    hikari: # springboot 2.0 整合了hikari ,据说这是目前性能最好的java数据库连接池
      username: xxxx
      password: xxxx
  jpa:
    hibernate:
      ddl-auto: update  # 第一次建表create  后面用update,要不然每次重启都会新建表
    show-sql: true
    #配置文件中配置 登陆账号密码
#  security:
#    user:
#      name: admin
#      password: admin

#端口号配置  默认是8080
server:
  port: 8081

Se ha realizado el trabajo de preparación básica. Escriba el primer método de controlador a continuación

1. Inicie sesión con la contraseña de cuenta predeterminada de SpringSecurity

package com.example.reviewsecurity.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author xiang
 * @CreatTime 2020/4/17
 * @Describe
 */
@RestController
@RequestMapping("/meetingFriends")
public class SecurityController {

    @GetMapping("/accost")
    public String firstTime(){
        return "hello,we haven't before,have we?";
    }
}

Luego, inicie el proyecto y verá que la consola imprimirá una cadena de caracteres.

Esta es la contraseña de contraseña cuando SpringSecurity inicia sesión. Será diferente cada vez. El nombre de usuario predeterminado es user

En la página, acceda a la ruta escrita en el controlador http: // localhost: 8081 / meetingFriends / accost    y luego SpringSecurity intercepta

Después de una entrada exitosa, puede ingresar a la página

2. Use el archivo de configuración para configurar el inicio de sesión de cuenta y contraseña

Descomente las notas en el archivo de configuración

Configure la contraseña de la cuenta de inicio de sesión en la 
seguridad del archivo de configuración : 
  usuario: 
    nombre: 
    contraseña de administrador: admin

Luego reinicie el proyecto e inicie sesión con esta cuenta. De hecho, no es necesario reiniciar porque la implementación en caliente se ha establecido en el archivo de configuración

Si la implementación en caliente no es buena

Configuración IDEA

Cuando modificamos la clase Java, IDEA no se compila automáticamente de forma predeterminada, y spring-boot-devtools monitorea los cambios en el archivo en el classpath antes de reiniciar la aplicación, por lo que debe configurar la compilación automática IDEA:

(1) File-Settings-Compiler-Build Project automáticamente

(2) ctrl + shift + alt + /, 选择 Registry, 勾 上 Compilador autoMake permitir cuando se ejecuta la aplicación

Solo ok

Tres usan la clase de configuración para establecer la contraseña de la cuenta y establecer permisos

Crear una clase de configuración

package com.example.reviewsecurity.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

/**
 * @Author xiang
 * @CreatTime 2020/4/17
 * @Describe
 */
@Configuration
@EnableWebSecurity //开启springSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("user").password(passwordEncoder().encode("user")).roles("normal");
        auth.inMemoryAuthentication().withUser("admin").password(passwordEncoder().encode("admin")).roles("manager");
    }

    @Bean //不可忘记加 否者此方法无效 依旧会报 java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
}

 

Si configura de esta manera al configurar una cuenta

 auth.inMemoryAuthentication().withUser("admin").password("admin").roles();

Error al iniciar sesión

java.lang.IllegalArgumentException: no hay ningún PasswordEncoder asignado para la identificación "nulo"

Razón:

A partir de Spring 5, se requiere el cifrado de contraseña obligatorio. Spring Security proporciona la herramienta de codificación de contraseña BCryptPasswordEncoder, que puede ser muy conveniente para implementar el cifrado de contraseña y la sal. Los resultados del mismo cifrado de texto sin formato son siempre diferentes, por lo que el usuario no necesita guardar campos adicionales . Esto es mucho más conveniente que Shiro.

 

Establecer permisos

Clase de configuración

package com.example.reviewsecurity.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

import javax.annotation.PostConstruct;

/**
 * @Author xiang
 * @CreatTime 2020/4/17
 * @Describe
 */
@Configuration
@EnableWebSecurity //开启springSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)//开启安全级别的权限控制  开启验证权限 prePostEnabled为true的时候会拦截标有@PreAuthorize的方法 验证权限
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("user").password(passwordEncoder().encode("user")).roles("normal");
        auth.inMemoryAuthentication().withUser("admin").password(passwordEncoder().encode("admin")).roles("manager");
    }

    @Bean //不可忘记加 否者此方法无效 依旧会报 java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null"
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }
}

controlador

package com.example.reviewsecurity.controller;

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author xiang
 * @CreatTime 2020/4/17
 * @Describe
 */
@RestController
@RequestMapping("/meetingFriends")
public class SecurityController {

    @GetMapping("/accost")
    public String firstTime(){
        return "hello,we haven't before,have we?";
    }

    @GetMapping("/greet")
    @PreAuthorize("hasAnyRole('normal','manager')") //设置权限让指定的角色进行访问此方法,多个角色可用逗号隔开
    public String secondTime(){
        return "how are you doing?";
    }


    /**
     * 角色 normal 访问此方法时 因权限不足 页面会报错  There was an unexpected error (type=Forbidden, status=403).
     * */
    @GetMapping("/familiar")
    @PreAuthorize("hasAnyRole('manager')")
    public String thirtyTime(){
        return "hi,what's up?";
    }


}

La página informa un error cuando los derechos de acceso son insuficientes

Base de datos de cuatro conexiones con inicio de sesión

Clase de entidad

package com.example.reviewsecurity.domain;

import lombok.Data;

import javax.persistence.*;

/**
 * @Author xiang
 * @CreatTime 2020/4/17
 * @Describe
 */
@Entity
@Data
public class UserInfo {

    @Id    //主键
    @GeneratedValue  //自增
    private Long userId;
    private String userName;
    private String passWord;

    @Enumerated(EnumType.STRING)
    private Role role;
    public enum  Role{
        normal,manager;
    }
}

capa de dao

package com.example.reviewsecurity.dao;

import com.example.reviewsecurity.domain.UserInfo;
import org.springframework.data.jpa.repository.JpaRepository;

/**
 * @Author xiang
 * @CreatTime 2020/4/17
 * @Describe
 */
public interface SecurityDao extends JpaRepository<UserInfo,Long> {
    UserInfo getUserInfoByUserName(String userName);
}

capa de servicio

package com.example.reviewsecurity.service;

import com.example.reviewsecurity.domain.UserInfo;

/**
 * @Author xiang
 * @CreatTime 2020/4/17
 * @Describe
 */
public interface SecurityService {
    UserInfo getUserInfoByUserName(String userName);
}

clase de implementación de servicio

package com.example.reviewsecurity.service.impl;

import com.example.reviewsecurity.dao.SecurityDao;
import com.example.reviewsecurity.domain.UserInfo;
import com.example.reviewsecurity.service.SecurityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @Author xiang
 * @CreatTime 2020/4/17
 * @Describe
 */
@Service
public class SecurityServiceImpl implements SecurityService {

    @Autowired
    SecurityDao securityDao;
    @Override
    public UserInfo getUserInfoByUserName(String userName) {
        return securityDao.getUserInfoByUserName(userName);
    }
}

Inicializacion de datos

package com.example.reviewsecurity.dataSource;

import com.example.reviewsecurity.dao.SecurityDao;
import com.example.reviewsecurity.domain.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;

/**
 * @Author xiang
 * @CreatTime 2020/4/17
 * @Describe
 */
@Service
public class SecurityDataSource {

    @Autowired
    SecurityDao securityDao;

    @PostConstruct //当项目启动的时候  初始化数据
    public void dataInit(){
        UserInfo lili = new  UserInfo();
        lili.setUserName("lili");
        lili.setPassWord("lili");
        lili.setRole(UserInfo.Role.manager);
        securityDao.save(lili);
        UserInfo huahua = new  UserInfo();
        huahua.setUserName("huahua");
        huahua.setPassWord("huahua");
        huahua.setRole(UserInfo.Role.normal);
        securityDao.save(huahua);
    }
}

Clase de configuración

package com.example.reviewsecurity.config;

import com.example.reviewsecurity.domain.UserInfo;
import com.example.reviewsecurity.service.SecurityService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author xiang
 * @CreatTime 2020/4/17
 * @Describe
 */
@Component
public class UserDetail implements UserDetailsService {

    @Autowired
    SecurityService securityService;
    
    @Autowired
    PasswordEncoder passwordEncoder;

    @Override
    public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
        UserInfo userInfoByUserName = securityService.getUserInfoByUserName(userName);

        List<GrantedAuthority> role = new ArrayList<>();
        role.add(new SimpleGrantedAuthority("ROLE_"+userInfoByUserName.getRole().name()));
      //  User userDetail = new User(userInfoByUserName.getUserName(),userInfoByUserName.getPassWord(),role);
        User userDetail = new User(userInfoByUserName.getUserName(),passwordEncoder.encode(userInfoByUserName.getPassWord()),role);
        return userDetail;
    }
}

El tercer rol de parámetro en el constructor del usuario es una colección.

Después de escribir, antes de que comience el proyecto, preste atención    a comentar la cuenta de permisos establecida en el archivo de configuración anterior, de lo contrario

Credenciales de insignia

Después de comentar, inicie sesión de acuerdo con el valor correspondiente en la base de datos.

-------------------------------------------------- --------------------

Proceso de inicio del proyecto

Inicio del proyecto --- Datos de inicialización ---- Inicio de sesión ---- Vaya a la clase de configuración para obtener userDetail según userName ---- Obtenga el rol de userDetail y vaya al método controlador

 

9 artículos originales publicados · Me gusta1 · Visitas 480

Supongo que te gusta

Origin blog.csdn.net/cdliker/article/details/105573020
Recomendado
Clasificación