Rumah > Java > javaTutorial > teks badan

Menggunakan Apache Shiro untuk kawalan kebenaran dalam pembangunan API Java

WBOY
Lepaskan: 2023-06-17 21:31:40
asal
936 orang telah melayarinya

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!

Label berkaitan:
sumber:php.cn
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!