Jadual Kandungan
Persediaan
Paparan kesan
Pelaksanaan
Rumah Java javaTutorial Bagaimanakah SpringBoot mengintegrasikan SpringSecurityOauth2 untuk melaksanakan isu kebenaran dinamik untuk pengesahan?

Bagaimanakah SpringBoot mengintegrasikan SpringSecurityOauth2 untuk melaksanakan isu kebenaran dinamik untuk pengesahan?

May 11, 2023 am 10:28 AM
spring springboot security

Persediaan

spring-boot: 2.1.4.RELEASE

spring-security-oauth3: 2.3.3.RELEASE (Jika anda ingin menggunakan kod sumber, jangan ubah ini nombor versi sesuka hati, kerana 2.4 ditulis secara berbeza)

mysql: 5.7

Paparan kesan

Hanya posmen digunakan untuk ujian di sini, dan halaman hadapan tidak digunakan untuk dok lagi. Seterusnya Akan ada paparan halaman untuk peruntukan kebenaran menu peranan setiap versi

1 Akses antara muka terbuka http://localhost:7000/open/hello

Bagaimanakah SpringBoot mengintegrasikan SpringSecurityOauth2 untuk melaksanakan isu kebenaran dinamik untuk pengesahan?

2 , Akses antara muka yang dilindungi http://localhost:7000/admin/user/info

Bagaimanakah SpringBoot mengintegrasikan SpringSecurityOauth2 untuk melaksanakan isu kebenaran dinamik untuk pengesahan?

tanpa token Log masuk semasa maklumat pengguna

Bagaimanakah SpringBoot mengintegrasikan SpringSecurityOauth2 untuk melaksanakan isu kebenaran dinamik untuk pengesahan?

Bagaimanakah SpringBoot mengintegrasikan SpringSecurityOauth2 untuk melaksanakan isu kebenaran dinamik untuk pengesahan?

Pelaksanaan

oauth3 mempunyai empat mod secara keseluruhan, yang tidak akan dijelaskan di sini mencari dalam talian dan menemui perkara yang sama

Kerana sekarang kami hanya mempertimbangkan aplikasi unilateral, jadi mod kata laluan digunakan.

Akan ada artikel di SpringCloud+Oauth3 nanti, pengesahan get laluan

Mari kita bincangkan beberapa perkara

1 keizinan dinamik konfigurasi pemintas

Bagaimanakah SpringBoot mengintegrasikan SpringSecurityOauth2 untuk melaksanakan isu kebenaran dinamik untuk pengesahan?

Buat kelas MySecurityFilter baharu, warisi AbstractSecurityInterceptor dan laksanakan antara muka Penapis

Permulaan, sesuaikan pengurus keputusan akses

@PostConstruct
 public void init(){
        super.setAuthenticationManager(authenticationManager);
        super.setAccessDecisionManager(myAccessDecisionManager);
  }
Salin selepas log masuk

Penapis tersuai memanggil elemen keselamatan Data sumber

@Override
public SecurityMetadataSource obtainSecurityMetadataSource() {
    return this.mySecurityMetadataSource;
}
Salin selepas log masuk

Mari kita lihat dahulu kod teras penapis tersuai yang memanggil sumber metadata selamat

Kod berikut digunakan untuk mendapatkan kebenaran (peranan) yang diperlukan untuk permintaan semasa untuk masuk

/**
     * 获得当前请求所需要的角色
     * @param object
     * @return
     * @throws IllegalArgumentException
     */
    @Override
    public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException {
        String requestUrl = ((FilterInvocation) object).getRequestUrl();

        if (IS_CHANGE_SECURITY) {
            loadResourceDefine();
        }
        if (requestUrl.indexOf("?") > -1) {
            requestUrl = requestUrl.substring(0, requestUrl.indexOf("?"));
        }
        UrlPathMatcher matcher = new UrlPathMatcher();
        List<Object> list = new ArrayList<>();  //无需权限的,直接返回
        list.add("/oauth/**");
        list.add("/open/**");
        if(matcher.pathsMatchesUrl(list,requestUrl))
            return null;

        Set<String> roleNames = new HashSet();
        for (Resc resc: resources) {
            String rescUrl = resc.getResc_url();
            if (matcher.pathMatchesUrl(rescUrl, requestUrl)) {
                if(resc.getParent_resc_id() != null && resc.getParent_resc_id().intValue() == 1){   //默认权限的则只要登录了,无需权限匹配都可访问
                    roleNames = new HashSet();
                    break;
                }
                Map map = new HashMap();
                map.put("resc_id", resc.getResc_id());
                // 获取能访问该资源的所有权限(角色)
                List<RoleRescDTO> roles = roleRescMapper.findAll(map);
                for (RoleRescDTO rr : roles)
                    roleNames.add(rr.getRole_name());
            }
        }

        Set<ConfigAttribute> configAttributes = new HashSet();
        for(String roleName:roleNames)
            configAttributes.add(new SecurityConfig(roleName));

        log.debug("【所需的权限(角色)】:" + configAttributes);

        return configAttributes;
    }
Salin selepas log masuk

Mari kita lihat kod teras pengurus keputusan akses tersuai Kod ini digunakan terutamanya untuk menentukan sama ada pengguna yang sedang log masuk (peranan yang dimiliki oleh pengguna yang sedang log masuk akan ditulis. dalam item terakhir) mempunyai peranan kebenaran

@Override
    public void decide(Authentication authentication, Object o, Collection<ConfigAttribute> configAttributes) throws AccessDeniedException, InsufficientAuthenticationException {
        if(configAttributes == null){   //属于白名单的,不需要权限
            return;
        }
        Iterator<ConfigAttribute> iterator = configAttributes.iterator();
        while (iterator.hasNext()){
            ConfigAttribute configAttribute = iterator.next();
            String needPermission = configAttribute.getAttribute();
            for (GrantedAuthority ga: authentication.getAuthorities()) {
                if(needPermission.equals(ga.getAuthority())){   //有权限,可访问
                    return;
                }
            }
        }
        throw new AccessDeniedException("没有权限访问");

    }
Salin selepas log masuk

2 Pengecualian pengesahan tersuai mengembalikan hasil yang sama

Mengapa ini diperlukan? hujung dan belakang untuk memahami kandungan yang dikembalikan apabila pengesahan gagal Ia tidak boleh ditafsirkan secara seragam, jadi tanpa berlengah lagi, mari kita lihat situasi pemulangan tanpa konfigurasi dan konfigurasi

(1) Sebelum penyesuaian, apabila. anda tidak membawa token untuk mengakses antara muka API yang dilindungi, hasil yang dikembalikan adalah Seperti ini

Bagaimanakah SpringBoot mengintegrasikan SpringSecurityOauth2 untuk melaksanakan isu kebenaran dinamik untuk pengesahan?

(2) Mari kita tetapkan bahawa selepas antara muka yang gagal pengesahan kembali ke antara muka , ia akan menjadi yang berikut. Adakah lebih baik untuk kita memproses dan menggesa pengguna

Bagaimanakah SpringBoot mengintegrasikan SpringSecurityOauth2 untuk melaksanakan isu kebenaran dinamik untuk pengesahan?

Baiklah, mari kita lihat di mana untuk mengkonfigurasinya Pelayan sumber kami OautyResourceConfig, tulis semula bahagian kod berikut untuk menyesuaikan pengesahan Hasilnya dikembalikan oleh kanan abnormal

Anda boleh merujuk kepada ini https://www.yisu.com/article/131668.htm

@Override
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
        resources.authenticationEntryPoint(authenticationEntryPoint)    //token失效或没携带token时
                .accessDeniedHandler(requestAccessDeniedHandler);   //权限不足时
    }
Salin selepas log masuk

Bagaimanakah SpringBoot mengintegrasikan SpringSecurityOauth2 untuk melaksanakan isu kebenaran dinamik untuk pengesahan? 3. Dapatkan pengguna log masuk Semasa

Yang pertama: gunakan JWT untuk membawa maklumat pengguna, dan kemudian menghuraikannya selepas mendapat token

Tiada penjelasan buat masa ini

Yang kedua: tulis SecurityUser untuk melaksanakan UserDetails Interface (ini adalah yang digunakan dalam projek ini)

Antara muka UserDetails yang asal hanya mempunyai nama pengguna dan kata laluan . Di sini kami menambah Pengguna dalam sistem kami

protected User user;
    public SecurityUser(User user) {
        this.user = user;
    }

    public User getUser() {
        return user;
    }
Salin selepas log masuk

Dalam BaseController, setiap Pengawal Semua akan mewarisi ini, dan menulis kaedah getUser() di dalamnya selagi pengguna membawa token untuk mengakses, kami boleh terus dapatkan maklumat pengguna yang sedang log masuk

protected User getUser() {
        try {
            SecurityUser userDetails = (SecurityUser) SecurityContextHolder.getContext().getAuthentication()
                    .getPrincipal();

            User user = userDetails.getUser();
            log.debug("【用户:】:" + user);

            return user;
        } catch (Exception e) {
        }
        return null;
    }
Salin selepas log masuk

Jadi bagaimana untuk mendapatkannya selepas pengguna berjaya log masuk Bagi koleksi peranan pengguna, dsb., antara muka UserDetailsService mesti dilaksanakan di sini

<🎜? >

@Service
public class TokenUserDetailsService implements UserDetailsService{

    @Autowired
    private LoginService loginService;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = loginService.loadUserByUsername(username);  //这个我们拎出来处理
        if(Objects.isNull(user))
            throw new UsernameNotFoundException("用户名不存在");
        return new SecurityUser(user);
    }
}
Salin selepas log masuk

Kemudian dalam kelas konfigurasi keselamatan kami, tetapkan UserDetailsService kepada yang kami tulis di atasBagaimanakah SpringBoot mengintegrasikan SpringSecurityOauth2 untuk melaksanakan isu kebenaran dinamik untuk pengesahan?

@Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }
Salin selepas log masuk

Akhirnya kami hanya perlu melaksanakan kami kaedah dalam loginService, dan nilai sama ada pengguna itu wujud berdasarkan pemprosesan perniagaan sebenar kami Bagaimanakah SpringBoot mengintegrasikan SpringSecurityOauth2 untuk melaksanakan isu kebenaran dinamik untuk pengesahan?

@Override
    public User loadUserByUsername(String username){
        log.debug(username);
        Map map = new HashMap();
        map.put("username",username);
        map.put("is_deleted",-1);
        User user = userMapper.findByUsername(map);
        if(user != null){
            map = new HashMap();
            map.put("user_id",user.getUser_id());
            //查询用户的角色
            List<UserRoleDTO> userRoles = userRoleMapper.findAll(map);
            user.setRoles(listRoles(userRoles));
            //权限集合
            Collection<? extends GrantedAuthority> authorities = merge(userRoles);
            user.setAuthorities(authorities);
            return user;
        }
        return null;

    }
Salin selepas log masuk
fail pangkalan data Di Sini

Bagaimanakah SpringBoot mengintegrasikan SpringSecurityOauth2 untuk melaksanakan isu kebenaran dinamik untuk pengesahan?

Atas ialah kandungan terperinci Bagaimanakah SpringBoot mengintegrasikan SpringSecurityOauth2 untuk melaksanakan isu kebenaran dinamik untuk pengesahan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

17 cara untuk menyelesaikan skrin biru kernel_security_check_failure 17 cara untuk menyelesaikan skrin biru kernel_security_check_failure Feb 12, 2024 pm 08:51 PM

Kernelsecuritycheckfailure (kegagalan pemeriksaan kernel) adalah jenis kod henti yang agak biasa Walau bagaimanapun, tidak kira apa sebabnya, ralat skrin biru menyebabkan ramai pengguna merasa tertekan dengan berhati-hati. 17 penyelesaian kepada skrin biru kernel_security_check_failure Kaedah 1: Alih keluar semua peranti luaran Apabila mana-mana peranti luaran yang anda gunakan tidak serasi dengan versi Windows anda, ralat skrin biru Kernelsecuritycheckfailure mungkin berlaku. Untuk melakukan ini, anda perlu mencabut semua peranti luaran sebelum cuba memulakan semula komputer anda.

Paradigma pengaturcaraan baharu, apabila Spring Boot bertemu OpenAI Paradigma pengaturcaraan baharu, apabila Spring Boot bertemu OpenAI Feb 01, 2024 pm 09:18 PM

Pada tahun 2023, teknologi AI telah menjadi topik hangat dan memberi impak besar kepada pelbagai industri, terutamanya dalam bidang pengaturcaraan. Orang ramai semakin menyedari kepentingan teknologi AI, dan komuniti Spring tidak terkecuali. Dengan kemajuan berterusan teknologi GenAI (General Artificial Intelligence), ia menjadi penting dan mendesak untuk memudahkan penciptaan aplikasi dengan fungsi AI. Dengan latar belakang ini, "SpringAI" muncul, bertujuan untuk memudahkan proses membangunkan aplikasi berfungsi AI, menjadikannya mudah dan intuitif serta mengelakkan kerumitan yang tidak perlu. Melalui "SpringAI", pembangun boleh membina aplikasi dengan lebih mudah dengan fungsi AI, menjadikannya lebih mudah untuk digunakan dan dikendalikan.

Gunakan Spring Boot dan Spring AI untuk membina aplikasi kecerdasan buatan generatif Gunakan Spring Boot dan Spring AI untuk membina aplikasi kecerdasan buatan generatif Apr 28, 2024 am 11:46 AM

Sebagai peneraju industri, Spring+AI menyediakan penyelesaian terkemuka untuk pelbagai industri melalui API yang berkuasa, fleksibel dan fungsi lanjutannya. Dalam topik ini, kami akan menyelidiki contoh aplikasi Spring+AI dalam pelbagai bidang Setiap kes akan menunjukkan cara Spring+AI memenuhi keperluan khusus, mencapai matlamat dan meluaskan LESSONSLEARNED ini kepada rangkaian aplikasi yang lebih luas. Saya harap topik ini dapat memberi inspirasi kepada anda untuk memahami dan menggunakan kemungkinan Spring+AI yang tidak terhingga dengan lebih mendalam. Rangka kerja Spring mempunyai sejarah lebih daripada 20 tahun dalam bidang pembangunan perisian, dan sudah 10 tahun sejak versi Spring Boot 1.0 dikeluarkan. Sekarang, tiada siapa boleh mempertikaikan Spring itu

Apakah kaedah pelaksanaan transaksi program musim bunga? Apakah kaedah pelaksanaan transaksi program musim bunga? Jan 08, 2024 am 10:23 AM

Cara melaksanakan transaksi terprogram musim bunga: 1. Gunakan TransactionTemplate 2. Gunakan TransactionCallback dan TransactionCallbackWithoutResult 3. Gunakan anotasi Transaksional;

Analisis perbandingan dan perbezaan antara SpringBoot dan SpringMVC Analisis perbandingan dan perbezaan antara SpringBoot dan SpringMVC Dec 29, 2023 am 11:02 AM

SpringBoot dan SpringMVC adalah kedua-dua rangka kerja yang biasa digunakan dalam pembangunan Java, tetapi terdapat beberapa perbezaan yang jelas antara mereka. Artikel ini akan meneroka ciri dan penggunaan kedua-dua rangka kerja ini dan membandingkan perbezaannya. Mula-mula, mari belajar tentang SpringBoot. SpringBoot telah dibangunkan oleh pasukan Pivotal untuk memudahkan penciptaan dan penggunaan aplikasi berdasarkan rangka kerja Spring. Ia menyediakan cara yang pantas dan ringan untuk membina bersendirian, boleh dilaksanakan

Cara menetapkan tahap pengasingan transaksi dalam Spring Cara menetapkan tahap pengasingan transaksi dalam Spring Jan 26, 2024 pm 05:38 PM

Cara menetapkan tahap pengasingan transaksi dalam Spring: 1. Gunakan anotasi @Transactional 2. Tetapkan dalam fail konfigurasi Spring 3. Gunakan PlatformTransactionManager 4. Tetapkan dalam kelas konfigurasi Java. Pengenalan terperinci: 1. Gunakan anotasi @Transactional, tambah anotasi @Transactional pada kelas atau kaedah yang memerlukan pengurusan transaksi dan tetapkan tahap pengasingan dalam atribut 2. Dalam fail konfigurasi Spring, dsb.

Anotasi Musim Bunga Didedahkan: Analisis Anotasi Biasa Anotasi Musim Bunga Didedahkan: Analisis Anotasi Biasa Dec 30, 2023 am 11:28 AM

Spring ialah rangka kerja sumber terbuka yang menyediakan banyak anotasi untuk memudahkan dan meningkatkan pembangunan Java. Artikel ini akan menerangkan anotasi Spring yang biasa digunakan secara terperinci dan memberikan contoh kod khusus. @Autowired: Autowired @Autowired anotasi boleh digunakan untuk wayar secara automatik dalam bekas Spring. Apabila kami menggunakan anotasi @Autowired di mana kebergantungan diperlukan, Spring akan mencari kacang yang sepadan dalam bekas dan menyuntiknya secara automatik. Kod sampel adalah seperti berikut: @Auto

Penjelasan terperinci tentang kaedah pemerolehan Kacang dalam Spring Penjelasan terperinci tentang kaedah pemerolehan Kacang dalam Spring Dec 30, 2023 am 08:49 AM

Penjelasan terperinci tentang kaedah pemerolehan Kacang dalam Spring Dalam rangka kerja Spring, pemerolehan Kacang merupakan bahagian yang sangat penting. Dalam aplikasi, kita selalunya perlu menggunakan suntikan kebergantungan atau mendapatkan contoh kacang secara dinamik. Artikel ini akan memperkenalkan secara terperinci cara mendapatkan kacang dalam Spring dan memberikan contoh kod khusus. Mendapatkan anotasi Bean@Component melalui anotasi @Component ialah salah satu anotasi yang biasa digunakan dalam rangka kerja Spring. Kita boleh melakukan ini dengan menambahkan @Compone pada kelas

See all articles