


Bagaimanakah SpringBoot mengintegrasikan SpringSecurityOauth2 untuk melaksanakan isu kebenaran dinamik untuk pengesahan?
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
2 , Akses antara muka yang dilindungi http://localhost:7000/admin/user/info
tanpa token Log masuk semasa maklumat pengguna
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
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); }
Penapis tersuai memanggil elemen keselamatan Data sumber
@Override public SecurityMetadataSource obtainSecurityMetadataSource() { return this.mySecurityMetadataSource; }
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; }
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("没有权限访问"); }
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
(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
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); //权限不足时 }
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; }
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; }
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); } }
Kemudian dalam kelas konfigurasi keselamatan kami, tetapkan UserDetailsService kepada yang kami tulis di atas
@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); }
Akhirnya kami hanya perlu melaksanakan kami kaedah dalam loginService, dan nilai sama ada pengguna itu wujud berdasarkan pemprosesan perniagaan sebenar kami
@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; }
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!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

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

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

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.

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.

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

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

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: 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.

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 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
