Rumah  >  Artikel  >  Java  >  Cara menggunakan SpringBoot+SpringSecurity untuk melaksanakan pengesahan kebenaran berdasarkan data sebenar

Cara menggunakan SpringBoot+SpringSecurity untuk melaksanakan pengesahan kebenaran berdasarkan data sebenar

王林
王林ke hadapan
2023-05-13 19:34:20909semak imbas

(1) Gambaran Keseluruhan

Spring Security ialah rangka kerja pengesahan dan kawalan akses yang berkuasa dan boleh disesuaikan terutamanya dalam dua perkara, pengesahan dan kebenaran. Saya pernah menulis blog tentang Spring Security sebelum ini, tetapi pada masa itu saya hanya memperkenalkan kes berdasarkan data olok-olok Dalam isu ini, saya akan memperkenalkan pelaksanaan pengesahan dan kebenaran berdasarkan data sebenar.

(2) Pembinaan projek awal

Untuk menunjukkan SpringSecurity dengan lebih baik, kami mula-mula membina projek web yang ringkas. Perkenalkan kebergantungan thymeleaf

<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-thymeleaf</artifactid>
</dependency>
<dependency>
    <groupid>org.thymeleaf</groupid>
    <artifactid>thymeleaf-spring5</artifactid>
</dependency>
<dependency>
    <groupid>org.thymeleaf.extras</groupid>
    <artifactid>thymeleaf-extras-java8time</artifactid>
</dependency>

Buat halaman log masuk, halaman utama dan beberapa halaman paparan tahap yang berbeza: log masuk.html

nbsp;html>


    <meta>
    <title>登陆页</title>


<div>
    <form>
        <h3>登陆页</h3>
        <input>
        <input>
        <button>登陆</button>
    </form>
</div>

index.html

nbsp;html>


    <meta>
    <title>首页</title>


<div>
    <h3>首页</h3>
    <a>登陆</a>
    <div>
        <div>
            <h4>level1</h4>
            <a>level-1-1</a>
            <hr>
            <a>level-1-2</a>
        </div>
        <div>
            <h4>level2</h4>
            <a>level-2-1</a>
            <hr>
            <a>level-2-2</a>
        </div>
        <div>
            <h4>level3</h4>
            <a>level-3-1</a>
            <hr>
            <a>level-3-2</a>
        </div>
    </div>
</div>

Selain itu, terdapat ialah Beberapa muka surat yang berlainan tahap

Cara menggunakan SpringBoot+SpringSecurity untuk melaksanakan pengesahan kebenaran berdasarkan data sebenar

tulis nombor yang sepadan dalam badan masing-masing.

nbsp;html>


    <meta>
    <title>Title</title>


level-1-1

Akhir sekali tulis pengawal untuk menerima permintaan:

@Controller
public class RouteController {

    @RequestMapping({"/","/index"})
    public String index(){
        return "index";
    }

    @RequestMapping("/login")
    public String toLogin(){
        return "login";
    }

    @RequestMapping("/level1/{id}")
    public String level1(@PathVariable("id")String id){
        return "level1/"+id;
    }
    @RequestMapping("/level2/{id}")
    public String level2(@PathVariable("id")String id){
        return "level2/"+id;
    }
    @RequestMapping("/level3/{id}")
    public String level3(@PathVariable("id")String id){
        return "level3/"+id;
    }
}

Kesan akhir adalah seperti berikut:

Cara menggunakan SpringBoot+SpringSecurity untuk melaksanakan pengesahan kebenaran berdasarkan data sebenar

Akhir sekali, halaman tahap dengan tahap yang berbeza dilaksanakan mengikut Lompat dengan kebenaran yang berbeza.

Cara menggunakan SpringBoot+SpringSecurity untuk melaksanakan pengesahan kebenaran berdasarkan data sebenar

Latar belakang dilaksanakan berdasarkan pangkalan data Mybatis dan Mysql, jadi selain memperkenalkan kebergantungan SpringSecurity, kami juga perlu memperkenalkan kebergantungan berkaitan Mybatis:

<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-security</artifactid>
</dependency>
<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-jdbc</artifactid>
</dependency>
<dependency>
    <groupid>mysql</groupid>
    <artifactid>mysql-connector-java</artifactid>
    <scope>runtime</scope>
</dependency>
<dependency>
    <groupid>org.mybatis.spring.boot</groupid>
    <artifactid>mybatis-spring-boot-starter</artifactid>
    <version>2.1.3</version>
</dependency>

dalam fail konfigurasi Tambah maklumat berkaitan sumber data dan konfigurasi Mybatis:

spring.datasource.url=jdbc:mysql://localhost:3306/security?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

mybatis.mapper-locations=classpath:mapper/*.xml

(3) Pelaksanaan pengesahan dan kebenaran

3.1 Reka bentuk struktur jadual

Pengesahan dan kebenaran dalam reka bentuk jadual Ia harus dibahagikan kepada dua jadual, satu jadual menyimpan maklumat pengguna termasuk kata laluan, dsb., dan jadual lain menyimpan maklumat keizinan satu lagi jadual diperlukan untuk mewujudkan perkaitan antara pengguna dan keizinan, memberikan struktur jadual terakhir:

CREATE TABLE `roles` (
  `id` int(4) NOT NULL,
  `rolename` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `sysuser` (
  `id` int(4) NOT NULL,
  `username` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE `user_role` (
  `id` int(4) NOT NULL,
  `user_id` int(4) DEFAULT NULL,
  `role_id` int(4) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
.

Seterusnya ialah kelas entiti, antara muka Mapper dan fail xml untuk ketiga-tiga jadual ini Anda tidak perlu melihat kod ini terutamanya melaksanakan operasi mencari pengguna dan kebenaran berkaitan melalui nama pengguna:

@Data
public class Roles {
    private Integer id;
    private String roleName;
}

@Data
public class SysUser {
    private Integer id;
    private String userName;
    private String password;
    private List<roles> roles;
}</roles>
<.>Antara muka Mapper:

public interface UserMapper {
    public SysUser getUserByUserName(@Param("userName") String userName);
}
pelaksanaan xml:

<?xml  version="1.0" encoding="UTF-8" ?>
nbsp;mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper>
    <resultmap>
        <id></id>
        <result></result>
        <result></result>
        <collection>
            <result></result>
        </collection>
    </resultmap>
    <select>
        select sysuser.*,roles.rolename
        from sysuser
        LEFT JOIN user_role on sysuser.id= user_role.user_id
        LEFT JOIN roles on user_role.role_id=roles.id
        where username= #{userName}
    </select>
</mapper>
3.2 Proses pengesahan

Proses pengesahan SpringSecurity adalah seperti ini, cari pengguna dalam pangkalan data melalui nama pengguna atau ID unik lain yang disimpan dalam penyulitan tidak simetri. Selepas mendapatkan pengguna, kata laluan yang dihantar dari meja depan disulitkan dan dibandingkan dengan medan yang disulitkan dalam pangkalan data untuk lulus pengesahan.

Langkah pertama dalam proses di atas, untuk mencari pengguna mengikut nama pengguna, perlu dilaksanakan melalui perkhidmatan Perkhidmatan, dan perkhidmatan Perkhidmatan ini perlu mewarisi antara muka UserDetailsService dalam Spring Security. Antara muka ini mengembalikan objek Pengguna SpringSecurity.

@Service
public class UserService implements UserDetailsService {

    @Resource
    private UserMapper userMapper;
    //根据用户名找到对应的用户信息
    @Override
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
        SysUser sysUser = userMapper.getUserByUserName(s);
        if (sysUser!=null){
            List<grantedauthority> roles=new ArrayList();
            sysUser.getRoles().stream().forEach(x->{
                roles.add(new SimpleGrantedAuthority(x.getRoleName()));
            });
            return new User(sysUser.getUserName(),sysUser.getPassword(),roles);
        }
        throw new UsernameNotFoundException("用户未找到");
    }
}</grantedauthority>
3.3 Konfigurasi pemintasan keselamatan

Selepas melengkapkan langkah di atas, mula mengkonfigurasi SecurityConfig Tahap kod adalah sangat mudah pangkalan data akan secara automatik Bandingkan kata laluan yang diambil dari pelayan dengan kata laluan yang diluluskan dari hujung hadapan. Pada masa yang sama, koleksi peranan juga diluluskan dalam UserService dan kebenaran yang berbeza boleh dilampirkan pada halaman yang berbeza di titik kebenaran.

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserService userService;
    //授权
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //首页所有人都能访问,level页面只有有权限的人才能访问
        http.authorizeRequests()
                .antMatchers("/").permitAll()
                .antMatchers("/level1/**").hasRole("vip1")
                .antMatchers("/level2/**").hasRole("vip2")
                .antMatchers("/level3/**").hasRole("vip3");
        //没有权限默认跳到登陆页,默认会重定向到/login
        http.formLogin();
    }

    //认证
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userService).passwordEncoder(new BCryptPasswordEncoder());

    }
}
3.4 Perkara lain yang perlu diberi perhatian

Kaedah penyulitan kata laluan yang saya gunakan semasa pengesahan ialah BCryptPasswordEncoder, jadi kata laluan yang disimpan dalam pangkalan data juga perlu disulitkan pendaftaran Sulitkan kata laluan dan simpan dalam pangkalan data dengan cara yang sama:

String password="xxx";
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
String encode=bCryptPasswordEncoder.encode(password);

Atas ialah kandungan terperinci Cara menggunakan SpringBoot+SpringSecurity untuk melaksanakan pengesahan kebenaran berdasarkan data sebenar. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam