Spring Security ialah rangka kerja pengesahan dan kawalan akses yang berkuasa dan boleh disesuaikan terutamanya dalam dua perkara, pengesahan dan kebenaran. Saya pernah menulis blog tentang Spring Security sebelum ini, tetapi pada masa itu saya hanya memperkenalkan kes berdasarkan data olok-olok Dalam isu ini, saya akan memperkenalkan pelaksanaan pengesahan dan kebenaran berdasarkan data sebenar.
Untuk menunjukkan SpringSecurity dengan lebih baik, kami mula-mula membina projek web yang ringkas. Perkenalkan kebergantungan thymeleaf
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-thymeleaf</artifactid> </dependency> <dependency> <groupid>org.thymeleaf</groupid> <artifactid>thymeleaf-spring5</artifactid> </dependency> <dependency> <groupid>org.thymeleaf.extras</groupid> <artifactid>thymeleaf-extras-java8time</artifactid> </dependency>
Buat halaman log masuk, halaman utama dan beberapa halaman paparan tahap yang berbeza: log masuk.html
nbsp;html> <meta> <title>登陆页</title> <div> <form> <h3>登陆页</h3> <input> <input> <button>登陆</button> </form> </div>
index.html
nbsp;html> <meta> <title>首页</title> <div> <h3>首页</h3> <a>登陆</a> <div> <div> <h4>level1</h4> <a>level-1-1</a> <hr> <a>level-1-2</a> </div> <div> <h4>level2</h4> <a>level-2-1</a> <hr> <a>level-2-2</a> </div> <div> <h4>level3</h4> <a>level-3-1</a> <hr> <a>level-3-2</a> </div> </div> </div>
Selain itu, terdapat ialah Beberapa muka surat yang berlainan tahap
tulis nombor yang sepadan dalam badan masing-masing.
nbsp;html> <meta> <title>Title</title> level-1-1
Akhir sekali tulis pengawal untuk menerima permintaan:
@Controller public class RouteController { @RequestMapping({"/","/index"}) public String index(){ return "index"; } @RequestMapping("/login") public String toLogin(){ return "login"; } @RequestMapping("/level1/{id}") public String level1(@PathVariable("id")String id){ return "level1/"+id; } @RequestMapping("/level2/{id}") public String level2(@PathVariable("id")String id){ return "level2/"+id; } @RequestMapping("/level3/{id}") public String level3(@PathVariable("id")String id){ return "level3/"+id; } }
Kesan akhir adalah seperti berikut:
Akhir sekali, halaman tahap dengan tahap yang berbeza dilaksanakan mengikut Lompat dengan kebenaran yang berbeza.
Latar belakang dilaksanakan berdasarkan pangkalan data Mybatis dan Mysql, jadi selain memperkenalkan kebergantungan SpringSecurity, kami juga perlu memperkenalkan kebergantungan berkaitan Mybatis:
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-security</artifactid> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-jdbc</artifactid> </dependency> <dependency> <groupid>mysql</groupid> <artifactid>mysql-connector-java</artifactid> <scope>runtime</scope> </dependency> <dependency> <groupid>org.mybatis.spring.boot</groupid> <artifactid>mybatis-spring-boot-starter</artifactid> <version>2.1.3</version> </dependency>
dalam fail konfigurasi Tambah maklumat berkaitan sumber data dan konfigurasi Mybatis:
spring.datasource.url=jdbc:mysql://localhost:3306/security?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8 spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver mybatis.mapper-locations=classpath:mapper/*.xml
Pengesahan dan kebenaran dalam reka bentuk jadual Ia harus dibahagikan kepada dua jadual, satu jadual menyimpan maklumat pengguna termasuk kata laluan, dsb., dan jadual lain menyimpan maklumat keizinan satu lagi jadual diperlukan untuk mewujudkan perkaitan antara pengguna dan keizinan, memberikan struktur jadual terakhir:
CREATE TABLE `roles` ( `id` int(4) NOT NULL, `rolename` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `sysuser` ( `id` int(4) NOT NULL, `username` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; CREATE TABLE `user_role` ( `id` int(4) NOT NULL, `user_id` int(4) DEFAULT NULL, `role_id` int(4) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;.
Seterusnya ialah kelas entiti, antara muka Mapper dan fail xml untuk ketiga-tiga jadual ini Anda tidak perlu melihat kod ini terutamanya melaksanakan operasi mencari pengguna dan kebenaran berkaitan melalui nama pengguna:
@Data public class Roles { private Integer id; private String roleName; } @Data public class SysUser { private Integer id; private String userName; private String password; private List<roles> roles; }</roles><.>Antara muka Mapper:
public interface UserMapper { public SysUser getUserByUserName(@Param("userName") String userName); }pelaksanaan xml:
<?xml version="1.0" encoding="UTF-8" ?> nbsp;mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper> <resultmap> <id></id> <result></result> <result></result> <collection> <result></result> </collection> </resultmap> <select> select sysuser.*,roles.rolename from sysuser LEFT JOIN user_role on sysuser.id= user_role.user_id LEFT JOIN roles on user_role.role_id=roles.id where username= #{userName} </select> </mapper>3.2 Proses pengesahanProses pengesahan SpringSecurity adalah seperti ini, cari pengguna dalam pangkalan data melalui nama pengguna atau ID unik lain yang disimpan dalam penyulitan tidak simetri. Selepas mendapatkan pengguna, kata laluan yang dihantar dari meja depan disulitkan dan dibandingkan dengan medan yang disulitkan dalam pangkalan data untuk lulus pengesahan. Langkah pertama dalam proses di atas, untuk mencari pengguna mengikut nama pengguna, perlu dilaksanakan melalui perkhidmatan Perkhidmatan, dan perkhidmatan Perkhidmatan ini perlu mewarisi antara muka UserDetailsService dalam Spring Security. Antara muka ini mengembalikan objek Pengguna SpringSecurity.
@Service public class UserService implements UserDetailsService { @Resource private UserMapper userMapper; //根据用户名找到对应的用户信息 @Override public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException { SysUser sysUser = userMapper.getUserByUserName(s); if (sysUser!=null){ List<grantedauthority> roles=new ArrayList(); sysUser.getRoles().stream().forEach(x->{ roles.add(new SimpleGrantedAuthority(x.getRoleName())); }); return new User(sysUser.getUserName(),sysUser.getPassword(),roles); } throw new UsernameNotFoundException("用户未找到"); } }</grantedauthority>3.3 Konfigurasi pemintasan keselamatan Selepas melengkapkan langkah di atas, mula mengkonfigurasi SecurityConfig Tahap kod adalah sangat mudah pangkalan data akan secara automatik Bandingkan kata laluan yang diambil dari pelayan dengan kata laluan yang diluluskan dari hujung hadapan. Pada masa yang sama, koleksi peranan juga diluluskan dalam UserService dan kebenaran yang berbeza boleh dilampirkan pada halaman yang berbeza di titik kebenaran.
@EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserService userService; //授权 @Override protected void configure(HttpSecurity http) throws Exception { //首页所有人都能访问,level页面只有有权限的人才能访问 http.authorizeRequests() .antMatchers("/").permitAll() .antMatchers("/level1/**").hasRole("vip1") .antMatchers("/level2/**").hasRole("vip2") .antMatchers("/level3/**").hasRole("vip3"); //没有权限默认跳到登陆页,默认会重定向到/login http.formLogin(); } //认证 @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userService).passwordEncoder(new BCryptPasswordEncoder()); } }3.4 Perkara lain yang perlu diberi perhatianKaedah penyulitan kata laluan yang saya gunakan semasa pengesahan ialah BCryptPasswordEncoder, jadi kata laluan yang disimpan dalam pangkalan data juga perlu disulitkan pendaftaran Sulitkan kata laluan dan simpan dalam pangkalan data dengan cara yang sama:
String password="xxx"; BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder(); String encode=bCryptPasswordEncoder.encode(password);
Atas ialah kandungan terperinci Cara menggunakan SpringBoot+SpringSecurity untuk melaksanakan pengesahan kebenaran berdasarkan data sebenar. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!