Spring Security는 강력하고 사용자 정의가 가능한 인증 및 액세스 제어 프레임워크로, 주로 인증과 권한 부여라는 두 가지 작업을 수행합니다. 이전에 Spring Security에 대한 블로그를 작성한 적이 있지만, 당시에는 모의 데이터를 기반으로 한 사례만 소개했습니다. 이번 호에서는 실제 데이터를 기반으로 인증 및 권한 부여 구현을 소개하겠습니다.
SpringSecurity를 더 잘 보여주기 위해 먼저 간단한 웹 프로젝트를 구축합니다. 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>
로그인 페이지, 홈페이지 및 다양한 수준의 여러 표시 페이지를 만듭니다. login.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>
또한 다양한 수준의 여러 페이지가 있습니다
각각 해당하는 번호를 본문에 적어주세요.
nbsp;html> <meta> <title>Title</title> level-1-1
마지막으로 요청을 수신할 컨트롤러를 작성합니다.
@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; } }
최종 효과는 다음과 같습니다.
마지막으로, 다양한 레벨의 레벨 페이지는 다양한 권한에 따라 이동할 수 있습니다.
백그라운드는 Mybatis 및 Mysql 데이터베이스를 기반으로 구현되므로 SpringSecurity 종속성을 도입하는 것 외에도 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>
구성 파일에 데이터 소스 관련 정보를 추가하고 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
인증 및 권한은 테이블 디자인에서 두 개의 테이블로 나누어야 합니다. 하나의 테이블은 비밀번호 등을 포함한 사용자 정보를 저장하고 다른 테이블은 저장합니다. 인증 정보도 필요합니다. 테이블은 최종 테이블 구조를 제공하여 사용자와 인증 간의 연결을 설정합니다.
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;
다음 단계는 이 세 테이블에 대한 엔터티 클래스, Mapper 인터페이스 및 xml 파일입니다. 코드를 보면 주로 사용자 패스를 구현합니다. 이름으로 사용자 및 관련 권한을 검색하는 작업:
@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>
Mapper 인터페이스:
public interface UserMapper { public SysUser getUserByUserName(@Param("userName") String userName); }
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>
SpringSecurity의 인증 프로세스는 다음과 같습니다. 먼저 찾기 사용자 이름이나 다른 고유 ID를 통해 데이터베이스에 저장됩니다. 이 사용자의 경우 사용자의 비밀번호는 비대칭 암호화로 저장됩니다. 사용자를 확보한 후 프론트 데스크에서 전달된 비밀번호를 암호화하고 데이터베이스의 암호화된 필드와 비교하여 인증을 통과합니다.
위 프로세스의 첫 번째 단계인 사용자 이름을 통해 사용자를 찾는 작업은 서비스 서비스를 통해 구현되어야 하며 이 서비스 서비스는 Spring Security의 UserDetailsService 인터페이스를 상속해야 합니다. 이 인터페이스는 SpringSecurity User 객체를 반환합니다.
@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>
위 단계를 완료한 후 보안 구성을 시작합니다. 구성 방법 SecurityConfig를 작성합니다. 인증이 userService 객체에 전달되면 데이터베이스에서 비밀번호를 가져오고 비교를 위해 프런트 엔드가 자동으로 전달됩니다. 동시에 역할 컬렉션도 userService에 전달되며 인증 지점에서 다양한 권한이 다양한 페이지에 첨부될 수 있습니다.
@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()); } }
인증 시 사용한 비밀번호 암호화 방법은 BCryptPasswordEncoder이므로 데이터베이스에 저장된 비밀번호도 암호화해야 하며, 일반적인 방법은 등록 시와 동일한 방법으로 비밀번호를 암호화하여 저장하는 것입니다. . 데이터베이스를 입력하세요:
String password="xxx"; BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder(); String encode=bCryptPasswordEncoder.encode(password);
위 내용은 SpringBoot+SpringSecurity를 사용하여 실제 데이터를 기반으로 인증 인증을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!