Rumah  >  Artikel  >  Java  >  Cara menggunakan Spring Boot untuk melaksanakan pengurusan pengesahan dan kebenaran keselamatan

Cara menggunakan Spring Boot untuk melaksanakan pengurusan pengesahan dan kebenaran keselamatan

王林
王林asal
2023-06-22 12:53:201908semak imbas

Dengan perkembangan Internet, keselamatan aplikasi menjadi sangat penting, dan setiap pengaturcara perlu memberi perhatian kepada isu keselamatan. Memandangkan rangka kerja Spring digunakan secara meluas dalam aplikasi peringkat perusahaan berskala besar, Spring Boot ialah pilihan yang sangat popular untuk membangunkan aplikasi web. Dalam artikel ini, kita akan belajar cara menggunakan Spring Boot untuk melaksanakan pengesahan keselamatan dan pengurusan kebenaran.

1. Pengesahan dan kebenaran

Sebelum kita mula membincangkan pelaksanaan Spring Boot tentang pengesahan dan kebenaran keselamatan, kita perlu memahami apa itu pengesahan dan kebenaran.

Pengesahan adalah untuk mengesahkan sama ada identiti sesuatu entiti adalah sah. Dalam aplikasi web, ia biasanya untuk mengesahkan sama ada pengguna adalah pengguna yang sah.

Kebenaran adalah untuk memberikan kebenaran operasi khusus kepada entiti selepas mengesahkan bahawa ia adalah sah. Dalam aplikasi web, adalah perkara biasa untuk mengesahkan bahawa pengguna mempunyai hak akses yang sesuai kepada sumber yang diminta.

2. Rangka Kerja Keselamatan Spring Boot

Spring Boot menyediakan rangka kerja keselamatan yang boleh melaksanakan pengurusan pengesahan dan kebenaran keselamatan untuk aplikasi web dengan mudah. Spring Security ialah sebahagian daripada rangka kerja keselamatan Spring Boot. Ia menyediakan rangka kerja yang boleh dikonfigurasikan untuk memastikan aplikasi boleh berjalan dengan selamat.

Spring Security menyediakan fungsi berikut:

1 Pengesahan dan kebenaran keselamatan

2 sokongan HTTPS

3 >4. Sokongan permintaan merentas domain

5 keizinan peringkat kaedah

6. Sokongan LDAP

7 sokongan

3. Konfigurasi keselamatan Spring Boot

Sebelum mula menggunakan Spring Boot untuk melaksanakan pengesahan dan kebenaran keselamatan, kita perlu memahami konfigurasi keselamatan Spring Boot.

Spring Boot menggunakan konfigurasi Java dan anotasi untuk mengkonfigurasi keselamatan. Konfigurasi keselamatan ditakrifkan dalam kelas yang diberi penjelasan dengan @EnableWebSecurity untuk mendayakan Keselamatan, dan kemudian mentakrifkan kelas yang diwarisi daripada WebSecurityConfigurerAdapter untuk mengkonfigurasi Keselamatan.

Berikut ialah contoh konfigurasi keselamatan Spring Boot asas:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/user/**").hasAnyRole("ADMIN", "USER")
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }
    
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("admin").password("admin").roles("ADMIN")
                .and()
                .withUser("user").password("user").roles("USER");
    }
}

Dalam konfigurasi di atas, kami mendayakan Keselamatan menggunakan anotasi @EnableWebSecurity dan kemudian menentukan kelas yang diwarisi daripada WebSecurityConfigurerAdapter. Kaedah

configure() akan dipanggil apabila aplikasi mula menetapkan peraturan untuk keselamatan permintaan HTTP. Dalam contoh ini, kami mentakrifkan tiga peraturan:

1 Sebarang URL yang bermula dengan /admin/ hanya dibenarkan untuk diakses oleh pengguna yang berperanan sebagai ADMIN.

2. Mana-mana URL yang bermula dengan /user/ membenarkan pengguna dengan peranan ADMIN atau USER untuk mengakses.

3. Semua permintaan lain memerlukan pengesahan.

Kaedah formLogin() mentakrifkan lokasi borang log masuk dan membenarkan semua pengguna mengaksesnya.

Kaedah log keluar() menetapkan fungsi log keluar dan membenarkan semua pengguna mengaksesnya.

Kaedah configureGlobal() mengkonfigurasi skema pengesahan dalam memori, termasuk nama pengguna dan kata laluan serta peranan yang ditetapkan.

Ini hanyalah contoh mudah, konfigurasi keselamatan yang lebih kompleks boleh disediakan menggunakan pelbagai pilihan Spring Security.

4. Pembekal pengesahan

Dalam contoh konfigurasi di atas, kami menggunakan skema pengesahan dalam memori. Walau bagaimanapun, pada hakikatnya kami biasanya menggunakan pangkalan data untuk menyimpan maklumat pengguna. Spring Security memberikan kami pembekal pengesahan untuk mengendalikan pengesahan.

Dalam Spring Security, penyedia pengesahan ialah antara muka yang perlu melaksanakan kaedah authenticate() untuk melaksanakan pengesahan. Pembekal pengesahan boleh dalam ingatan, pangkalan data hubungan atau berasaskan LDAP dsb.

Berikut ialah contoh penyedia pengesahan berasaskan pangkalan data:

@Service
public class UserDetailsServiceImp implements UserDetailsService {
    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByName(username);
        if (user == null) {
            throw new UsernameNotFoundException("User not found");
        }
        return new org.springframework.security.core.userdetails.User(user.getName(), user.getPassword(),
                AuthorityUtils.createAuthorityList(user.getAuthorities()));
    }
}

Dalam kod di atas, kami telah menentukan kelas UserDetailsServiceImp yang melaksanakan antara muka UserDetailsService. Kaedah loadUserByUsername() memuatkan maklumat pengguna daripada pangkalan data dan mengembalikan objek UserDetails Spring Security, yang mengandungi nama pengguna, kata laluan dan kebenaran.

5. Pengurusan kebenaran

Dalam Spring Boot, kami boleh menggunakan Spring Security untuk pengurusan kebenaran berasaskan peranan. Spring Security menyediakan dua kaedah untuk pengurusan kebenaran: deklaratif dan terprogram.

1. Perisytiharan

Dalam kebenaran perisytiharan, kami boleh menggunakan anotasi @PreAuthorize dan @PostAuthorize untuk menetapkan peraturan kawalan akses. @PreAuthorize digunakan untuk menentukan syarat yang perlu dipenuhi sebelum mengakses kaedah, manakala @PostAuthorize digunakan untuk menentukan syarat yang harus dipenuhi sebelum kembali.

Berikut ialah contoh pengurusan kebenaran berasaskan deklaratif:

@Service
public class ProductService {
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public void addProduct() {
        // add product
    }
    
    @PreAuthorize("hasRole('ROLE_USER')")
    @PostAuthorize("returnObject.owner == authentication.name")
    public Product findProductByName(String name) {
        // find product by name
    }
}

Dalam kod di atas, kami menambahkan anotasi @PreAuthorize pada addProduct() dan kaedah findProductByName() untuk menetapkan peraturan kawalan akses .

Dalam kaedah addProduct(), kami mengehadkan pengguna dengan peranan ROLE_ADMIN untuk mengakses kaedah ini.

Dalam kaedah findProductByName(), kami mengehadkan pengguna dengan peranan ROLE_USER untuk mengakses kaedah dan menetapkan peraturan kawalan akses lain menggunakan anotasi @PostAuthorize untuk memastikan bahawa hanya semua pengguna yang dimiliki oleh produk yang dikembalikan Produk akan dikembalikan hanya apabila pengguna adalah sama dengan pengguna yang disahkan.

2. Programmatic

Dalam kebenaran program, kami boleh menggunakan Spring Security API untuk menetapkan peraturan kawalan akses.

Berikut ialah contoh pengurusan kebenaran program:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserService userService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/user/**").hasAnyRole("ADMIN", "USER")
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll()
                .and()
            .csrf().disable()
            .exceptionHandling().accessDeniedHandler(accessDeniedHandler());
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userService).passwordEncoder(passwordEncoder());
    }
    
    @Bean
    public AccessDeniedHandler accessDeniedHandler(){
        return new CustomAccessDeniedHandler();
    }
    
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

在上面的代码中,我们定义了一个UserService类来处理用户信息,并在configure()方法中使用了accessDeniedHandler()方法来定制访问被拒绝时的错误信息。

我们还实现了一个CustomAccessDeniedHandler类来自定义访问被拒绝时的响应。

最后,我们使用了PasswordEncoder来编码密码。

六、结论

在本文中,我们了解了如何使用Spring Boot实现安全认证和授权管理。我们已经讨论了Spring Boot安全框架、安全配置、身份验证提供器和授权管理等关键概念。我们还讨论了如何使用声明式和编程式授权管理。通过使用Spring Boot的安全框架,我们可以轻松地为Web应用程序提供安全性,并确保应用程序可以安全地运行。

Atas ialah kandungan terperinci Cara menggunakan Spring Boot untuk melaksanakan pengurusan pengesahan dan kebenaran keselamatan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn