>  기사  >  Java  >  SpringBoot+SpringSecurity를 ​​사용하여 실제 데이터를 기반으로 인증 인증을 구현하는 방법

SpringBoot+SpringSecurity를 ​​사용하여 실제 데이터를 기반으로 인증 인증을 구현하는 방법

王林
王林앞으로
2023-05-13 19:34:20940검색

(1) 개요

Spring Security는 강력하고 사용자 정의가 가능한 인증 및 액세스 제어 프레임워크로, 주로 인증과 권한 부여라는 두 가지 작업을 수행합니다. 이전에 Spring Security에 대한 블로그를 작성한 적이 있지만, 당시에는 모의 데이터를 기반으로 한 사례만 소개했습니다. 이번 호에서는 실제 데이터를 기반으로 인증 및 권한 부여 구현을 소개하겠습니다.

(2) 사전 프로젝트 구축

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>

또한 다양한 수준의 여러 페이지가 있습니다

SpringBoot+SpringSecurity를 ​​사용하여 실제 데이터를 기반으로 인증 인증을 구현하는 방법

각각 해당하는 번호를 본문에 적어주세요.

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

최종 효과는 다음과 같습니다.

SpringBoot+SpringSecurity를 ​​사용하여 실제 데이터를 기반으로 인증 인증을 구현하는 방법

마지막으로, 다양한 레벨의 레벨 페이지는 다양한 권한에 따라 이동할 수 있습니다.

SpringBoot+SpringSecurity를 ​​사용하여 실제 데이터를 기반으로 인증 인증을 구현하는 방법

백그라운드는 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

(3) 인증 및 권한 구현

3.1 테이블 구조 설계

인증 및 권한은 테이블 디자인에서 두 개의 테이블로 나누어야 합니다. 하나의 테이블은 비밀번호 등을 포함한 사용자 정보를 저장하고 다른 테이블은 저장합니다. 인증 정보도 필요합니다. 테이블은 최종 테이블 구조를 제공하여 사용자와 인증 간의 연결을 설정합니다.

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>

3.2 인증 프로세스

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>

3.3 보안 차단 구성

위 단계를 완료한 후 보안 구성을 시작합니다. 구성 방법 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());

    }
}

3.4 기타 주의사항

인증 시 사용한 비밀번호 암호화 방법은 BCryptPasswordEncoder이므로 데이터베이스에 저장된 비밀번호도 암호화해야 하며, 일반적인 방법은 등록 시와 동일한 방법으로 비밀번호를 암호화하여 저장하는 것입니다. . 데이터베이스를 입력하세요:

String password="xxx";
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
String encode=bCryptPasswordEncoder.encode(password);

위 내용은 SpringBoot+SpringSecurity를 ​​사용하여 실제 데이터를 기반으로 인증 인증을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제