Rumah Java javaTutorial Menggunakan Apache Shiro untuk kawalan kebenaran dalam pembangunan API Java

Menggunakan Apache Shiro untuk kawalan kebenaran dalam pembangunan API Java

Jun 17, 2023 pm 09:31 PM
java api shiro

Gunakan Apache Shiro untuk kawalan kebenaran dalam pembangunan API Java

Dengan perkembangan teknologi Internet, semakin banyak aplikasi menggunakan seni bina berasaskan API. Untuk seni bina ini, data atau perkhidmatan didedahkan kepada sistem atau aplikasi luaran dalam bentuk API. Dalam kes ini, kawalan kebenaran pengguna adalah sangat penting. Artikel ini terutamanya memperkenalkan cara menggunakan Apache Shiro untuk mengurus isu kebenaran dalam Java API.

Ikhtisar Apache Shiro

Apache Shiro ialah rangka kerja sumber terbuka daripada Yayasan Perisian Apache yang menyediakan fungsi asas seperti pengesahan keselamatan, kebenaran, pengurusan kata laluan dan pengurusan sesi dalam aplikasi. Apache Shiro ialah rangka kerja keselamatan yang ringkas dan mudah digunakan yang membolehkan pembangun Java menumpukan pada logik perniagaan tanpa perlu risau tentang isu keselamatan.

Komponen utama Apache Shiro termasuk:

  1. Subjek: mewakili pengguna yang berinteraksi dengan aplikasi kami, yang boleh menjadi orang, program, perkhidmatan, dsb. Setiap Subjek mempunyai satu set "pengetua" berkaitan keselamatan yang boleh digunakan untuk mewakili identiti pengguna.
  2. SecurityManager: Digunakan untuk mengurus operasi keselamatan aplikasi. Tanggungjawab utamanya ialah pengesahan, kebenaran, penyulitan, dsb.
  3. Realm: digunakan untuk mendapatkan data aplikasi, seperti pengguna, peranan, kebenaran, dsb. Data boleh disimpan dalam pangkalan data, fail, dsb.
  4. SessionManager: Urus maklumat sesi untuk setiap pengguna, termasuk penciptaan, pembatalan, penyelenggaraan, dsb.
  5. Sesi: Mengekalkan maklumat sesi untuk setiap pengguna, termasuk status log masuk pengguna, dsb.
  6. Kriptografi: Menyediakan perkhidmatan keselamatan seperti penyulitan dan algoritma pencincangan.

Berdasarkan komponen di atas, Shiro menyediakan rangka kerja keselamatan lengkap yang boleh digunakan untuk membangunkan modul keselamatan dalam aplikasi Java.

Gunakan Apache Shiro untuk kawalan kebenaran

Dalam proses membangunkan API Java, selalunya perlu untuk mengawal kebenaran pengguna Shiro menyediakan penyelesaian yang fleksibel dan diperkemas untuk melaksanakan fungsi ini. Kaedah pelaksanaan khusus diperkenalkan di bawah:

  1. Memperkenalkan pakej pergantungan Shiro

Pertama, anda perlu menambah pakej pergantungan Shiro yang berkaitan pada projek. Sebagai contoh, dalam projek Maven, anda boleh menambah kod berikut dalam Kebenaran pom dan data lain yang berkaitan, dan menyepadukannya dengan rangka kerja Shiro. Oleh itu, mentakrifkan kelas Realm ialah langkah pertama untuk kawalan kebenaran.

    Kami boleh menyesuaikan kelas Realm untuk melaksanakan fungsi mendapatkan maklumat berkaitan pengguna daripada pangkalan data, seperti yang ditunjukkan di bawah:
  1. <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-core</artifactId>
        <version>1.5.3</version>
    </dependency> 
    Salin selepas log masuk
  2. Dalam kod di atas, kami menyediakannya dengan melaksanakan abstrak AuthorizingRealm kelas Kaedah doGetAuthorizationInfo dan kaedah doGetAuthenticationInfo digunakan untuk mendapatkan maklumat peranan dan kebenaran pengguna, dan untuk mengesahkan identiti pengguna. Kaedah ini akan memanggil UserService, RoleService, PermissionService dan lapisan perkhidmatan lain untuk menanyakan maklumat yang berkaitan dalam pangkalan data untuk mendapatkan data pengguna.

Konfigurasikan Penapis Shiro

Dalam API Java, kami boleh mengkonfigurasi Penapis Shiro untuk memintas permintaan dan mengawal kebenaran pengguna. Penapis Shiro ialah penapis Servlet yang boleh digunakan untuk penapisan kebenaran, pengurusan sesi, dll. dalam aplikasi web.

    Apabila mengkonfigurasi Penapis Shiro, kami perlu mengkonfigurasi pengurus keselamatan Shiro, kelas Realm tersuai, halaman log masuk bertulis, dsb. Contohnya adalah seperti berikut:
  1. public class MyRealm extends AuthorizingRealm {
        
        // 根据用户名获取用户即其角色、权限等相关信息
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
            // 获取当前用户的身份信息
            String username = (String) principalCollection.getPrimaryPrincipal();
            
            // 从数据库中查询用户及其角色
            User user = userService.loadByUsername(username);
            List<Role> roles = roleService.getRolesByUsername(username);
            
            // 添加角色
            List<String> roleNames = new ArrayList<>();
            for (Role role : roles) {
                roleNames.add(role.getName());
            }
            SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
            info.addRoles(roleNames);
            
            // 添加权限
            List<String> permissionNames = new ArrayList<>();
            for (Role role : roles) {
                List<Permission> permissions = permissionService.getPermissionsByRoleId(role.getId());
                for (Permission permission : permissions) {
                    permissionNames.add(permission.getName());
                }
            }
            info.addStringPermissions(permissionNames);
            
            return info;
        }
        
        // 根据用户名和密码验证用户
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
            // 获取用户提交的身份信息
            String username = (String) authenticationToken.getPrincipal();
            String password = new String((char[]) authenticationToken.getCredentials());
            
            // 根据用户名查询用户
            User user = userService.loadByUsername(username);
            if (user == null) {
                throw new UnknownAccountException();
            }
            
            // 验证用户密码
            String encodedPassword = hashService.hash(password, user.getSalt());
            if (!user.getPassword().equals(encodedPassword)) {
                throw new IncorrectCredentialsException();
            }
            
            // 如果验证成功,则返回一个身份信息
            SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, password, getName());
            return info;
        }
    }
    Salin selepas log masuk
  2. Dalam kod di atas, kami menggunakan anotasi @Configuration untuk mentakrifkan kelas ShiroConfig untuk mengkonfigurasi parameter berkaitan Shiro. Dalam kelas ini, kami mentakrifkan kaedah shirFilter(), kaedah securityManager() dan kaedah myRealm() untuk mengkonfigurasi penapis Shiro, pengurus keselamatan dan kelas Realm tersuai. Dalam kaedah yang sepadan, kami boleh menggunakan kebergantungan seperti UserService, RoleService, PermissionService, HashService, dll. untuk menyuntik perkhidmatan berkaitan melalui suntikan kebergantungan untuk mencapai kawalan kebenaran dan pengesahan pengguna.

Gunakan Shiro untuk kawalan kebenaran dalam Java API

Selepas melengkapkan langkah di atas, kami boleh menggunakan Shiro untuk kawalan kebenaran dalam Java API. Dalam pelaksanaan khusus, kita boleh menggunakan kelas Subjek yang disediakan oleh Shiro untuk mewakili pengguna semasa. Kita boleh menyemak sama ada pengguna mempunyai peranan atau kebenaran tertentu melalui hasRole(), isPermitted() dan kaedah lain kelas ini. Berikut ialah contoh:

@Configuration
public class ShiroConfig {

    @Bean
    public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
        shiroFilter.setSecurityManager(securityManager);

        // 设置登录URL
        shiroFilter.setLoginUrl("/login");
        // 设置无权访问的URL
        shiroFilter.setUnauthorizedUrl("/unauthorized");
        
        // 配置拦截器规则
        Map<String,String> filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/login", "anon");
        filterChainDefinitionMap.put("/logout", "logout");
        filterChainDefinitionMap.put("/home", "authc");
        filterChainDefinitionMap.put("/admin/**", "roles[admin]");
        filterChainDefinitionMap.put("/**", "authc");
        shiroFilter.setFilterChainDefinitionMap(filterChainDefinitionMap);

        return shiroFilter;
    }

    @Bean
    public SecurityManager securityManager(MyRealm myRealm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(myRealm);

        return securityManager;
    }
    
    @Bean
    public MyRealm myRealm(HashService hashService,
                           UserService userService,
                           RoleService roleService,
                           PermissionService permissionService) {
        return new MyRealm(userService, roleService, permissionService, hashService);
    }
    
    @Bean
    public HashService hashService() {
        return new SimpleHashService();
    }
}
Salin selepas log masuk
    Dalam kod di atas, kami mentakrifkan kelas ApiController dan mentakrifkan kaedah test() di dalamnya. Dalam kaedah ini, kami mula-mula mendapatkan objek Subjek pengguna semasa, dan kemudian membuat pertimbangan kebenaran dengan memanggil hasRole(), isPermitted() dan kaedah lain.
  1. Ringkasan

Kawalan kebenaran ialah isu yang sangat penting dalam pembangunan API Java. Apache Shiro menyediakan rangka kerja keselamatan yang mudah dan mudah digunakan yang boleh membantu pembangun Java dengan cepat melaksanakan pengesahan pengguna, kebenaran, pengurusan kata laluan, pengurusan sesi dan fungsi lain. Melalui pengenalan artikel ini, saya berharap pembaca dapat memahami dengan jelas cara menggunakan Shiro untuk melaksanakan fungsi kawalan kebenaran dalam pembangunan API Java.

Atas ialah kandungan terperinci Menggunakan Apache Shiro untuk kawalan kebenaran dalam pembangunan API Java. 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)

Soalan Temuduga Java Spring Soalan Temuduga Java Spring Aug 30, 2024 pm 04:29 PM

Dalam artikel ini, kami telah menyimpan Soalan Temuduga Spring Java yang paling banyak ditanya dengan jawapan terperinci mereka. Supaya anda boleh memecahkan temuduga.

Cuti atau kembali dari Java 8 Stream Foreach? Cuti atau kembali dari Java 8 Stream Foreach? Feb 07, 2025 pm 12:09 PM

Java 8 memperkenalkan API Stream, menyediakan cara yang kuat dan ekspresif untuk memproses koleksi data. Walau bagaimanapun, soalan biasa apabila menggunakan aliran adalah: bagaimana untuk memecahkan atau kembali dari operasi foreach? Gelung tradisional membolehkan gangguan awal atau pulangan, tetapi kaedah Foreach Stream tidak menyokong secara langsung kaedah ini. Artikel ini akan menerangkan sebab -sebab dan meneroka kaedah alternatif untuk melaksanakan penamatan pramatang dalam sistem pemprosesan aliran. Bacaan Lanjut: Penambahbaikan API Java Stream Memahami aliran aliran Kaedah Foreach adalah operasi terminal yang melakukan satu operasi pada setiap elemen dalam aliran. Niat reka bentuknya adalah

PHP: Bahasa utama untuk pembangunan web PHP: Bahasa utama untuk pembangunan web Apr 13, 2025 am 12:08 AM

PHP adalah bahasa skrip yang digunakan secara meluas di sisi pelayan, terutamanya sesuai untuk pembangunan web. 1.PHP boleh membenamkan HTML, memproses permintaan dan respons HTTP, dan menyokong pelbagai pangkalan data. 2.PHP digunakan untuk menjana kandungan web dinamik, data borang proses, pangkalan data akses, dan lain -lain, dengan sokongan komuniti yang kuat dan sumber sumber terbuka. 3. PHP adalah bahasa yang ditafsirkan, dan proses pelaksanaan termasuk analisis leksikal, analisis tatabahasa, penyusunan dan pelaksanaan. 4.Php boleh digabungkan dengan MySQL untuk aplikasi lanjutan seperti sistem pendaftaran pengguna. 5. Apabila debugging php, anda boleh menggunakan fungsi seperti error_reporting () dan var_dump (). 6. Mengoptimumkan kod PHP untuk menggunakan mekanisme caching, mengoptimumkan pertanyaan pangkalan data dan menggunakan fungsi terbina dalam. 7

TimeStamp to Date in Java TimeStamp to Date in Java Aug 30, 2024 pm 04:28 PM

Panduan untuk TimeStamp to Date di Java. Di sini kita juga membincangkan pengenalan dan cara menukar cap waktu kepada tarikh dalam java bersama-sama dengan contoh.

PHP vs Python: Memahami Perbezaan PHP vs Python: Memahami Perbezaan Apr 11, 2025 am 12:15 AM

PHP dan Python masing -masing mempunyai kelebihan sendiri, dan pilihannya harus berdasarkan keperluan projek. 1.Php sesuai untuk pembangunan web, dengan sintaks mudah dan kecekapan pelaksanaan yang tinggi. 2. Python sesuai untuk sains data dan pembelajaran mesin, dengan sintaks ringkas dan perpustakaan yang kaya.

Program Java untuk mencari kelantangan kapsul Program Java untuk mencari kelantangan kapsul Feb 07, 2025 am 11:37 AM

Kapsul adalah angka geometri tiga dimensi, terdiri daripada silinder dan hemisfera di kedua-dua hujungnya. Jumlah kapsul boleh dikira dengan menambahkan isipadu silinder dan jumlah hemisfera di kedua -dua hujungnya. Tutorial ini akan membincangkan cara mengira jumlah kapsul yang diberikan dalam Java menggunakan kaedah yang berbeza. Formula volum kapsul Formula untuk jumlah kapsul adalah seperti berikut: Kelantangan kapsul = isipadu isipadu silinder Dua jumlah hemisfera dalam, R: Radius hemisfera. H: Ketinggian silinder (tidak termasuk hemisfera). Contoh 1 masukkan Jejari = 5 unit Ketinggian = 10 unit Output Jilid = 1570.8 Unit padu menjelaskan Kirakan kelantangan menggunakan formula: Kelantangan = π × r2 × h (4

PHP vs Python: Ciri dan Fungsi Teras PHP vs Python: Ciri dan Fungsi Teras Apr 13, 2025 am 12:16 AM

PHP dan Python masing -masing mempunyai kelebihan sendiri dan sesuai untuk senario yang berbeza. 1.PHP sesuai untuk pembangunan web dan menyediakan pelayan web terbina dalam dan perpustakaan fungsi yang kaya. 2. Python sesuai untuk sains data dan pembelajaran mesin, dengan sintaks ringkas dan perpustakaan standard yang kuat. Apabila memilih, ia harus diputuskan berdasarkan keperluan projek.

PHP vs Bahasa Lain: Perbandingan PHP vs Bahasa Lain: Perbandingan Apr 13, 2025 am 12:19 AM

PHP sesuai untuk pembangunan web, terutamanya dalam pembangunan pesat dan memproses kandungan dinamik, tetapi tidak baik pada sains data dan aplikasi peringkat perusahaan. Berbanding dengan Python, PHP mempunyai lebih banyak kelebihan dalam pembangunan web, tetapi tidak sebaik python dalam bidang sains data; Berbanding dengan Java, PHP melakukan lebih buruk dalam aplikasi peringkat perusahaan, tetapi lebih fleksibel dalam pembangunan web; Berbanding dengan JavaScript, PHP lebih ringkas dalam pembangunan back-end, tetapi tidak sebaik JavaScript dalam pembangunan front-end.

See all articles