>Java >java지도 시간 >SpringBoot 보안 관리의 Shiro 프레임워크를 사용하는 방법

SpringBoot 보안 관리의 Shiro 프레임워크를 사용하는 방법

PHPz
PHPz앞으로
2023-05-10 17:49:061364검색

Shiro 소개

Apache Shiro는 인증, 승인, 비밀번호 관리, 세션 관리 및 기타 기능을 제공하는 경량 오픈 소스 Java 보안 프레임워크입니다. Spring Security에 비해 Shiro 프레임워크는 더 직관적이고 사용하기 쉬우며 강력한 보안도 제공합니다.

기존 SSM 프레임워크에는 Shiro를 수동으로 통합하는 데 여전히 많은 구성 단계가 있습니다. Spring Boot의 경우 Shiro는 Spring Boot에서 Shiro 구성을 단순화하기 위해 공식적으로 shiro-spring-boot-web-starter를 제공합니다.

Shiro 통합

1. 프로젝트 만들기

먼저 일반 Spring Boot 웹 프로젝트를 만들고 Shiro 종속성 및 페이지 템플릿 종속성을 추가합니다.

<dependency>
  <groupId>org.apache.shiro</groupId>
  <artifactId>shiro-spring-boot-web-starter</artifactId>
  <version>1.4.0</version>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
  <groupId>com.github.theborakompanioni</groupId>
  <artifactId>thymeleaf-extras-shiro</artifactId>
  <version>2.0.0</version>
</dependency>

spring-boot-starter-web 종속성, shiro-spring을 추가할 필요가 없습니다. -boot -web-starter는 이미 spring-boot-starter-web에 의존합니다. 동시에 Thymeleaf에서 shiro 태그를 사용하기 위해 Thymeleaf 템플릿이 사용됩니다. thymeleaf-extras-shiro 종속성이 추가됩니다.

2. Shiro 기본 구성

application.properties에서 Shiro의 기본 정보를 구성합니다

# Shiro 구성을 활성화합니다. 기본값은 true
shiro.enabled=true
# Shiro 웹 구성을 활성화합니다. 기본값은 true
shiro .web .enabled=true
# 로그인 주소를 구성합니다. 기본값은 /login.jsp
shiro.loginUrl=/login
# 성공적인 로그인을 위한 주소를 구성합니다. 기본값은 /
shiro.successUrl=/index
# Unauthorized 기본 점프 주소
shiro.unauthorizedUrl=/unauthorized
# URL 매개변수를 통한 세션 추적 허용 여부. 웹사이트가 쿠키를 지원하는 경우 이 옵션을 끌 수 있습니다. 기본값은 true입니다. 쿠키를 통해 세션 추적을 허용하려면 기본값은 Set true
shiro.sessionManager.sessionIdCookieEnabled=true

그런 다음 Java 코드로 Shiro를 구성하고 가장 기본적인 두 개의 Bean을 제공하세요.
@Configuration
public class ShiroConfig {
    @Bean
    public Realm realm() {
        TextConfigurationRealm realm = new TextConfigurationRealm();
        realm.setUserDefinitions("sang=123,user\n admin=123,admin");
        realm.setRoleDefinitions("admin=read,write\n user=read");
        return realm;
    }
    @Bean
    public ShiroFilterChainDefinition shiroFilterChainDefinition() {
        DefaultShiroFilterChainDefinition chainDefinition =
                new DefaultShiroFilterChainDefinition();
        chainDefinition.addPathDefinition("/login", "anon");
        chainDefinition.addPathDefinition("/doLogin", "anon");
        chainDefinition.addPathDefinition("/logout", "logout");
        chainDefinition.addPathDefinition("/**", "authc");
        return chainDefinition;
    }
    @Bean
    public ShiroDialect shiroDialect() {
        return new ShiroDialect();
    }
}

코드 설명:

    여기에 두 가지 핵심이 있습니다. 하나는 Realm이고 다른 하나는 ShiroFilterChainDefinition입니다. ShiroDialect의 경우 Thymeleaf에서 Shiro 태그 사용을 지원하기 위한 것입니다. Thymeleaf에서 Shiro 태그를 사용하지 않으면 ShiroDialect를 제공할 필요가 없습니다.
  • Realm은 사용자 정의 Realm이거나 Shiro가 제공하는 Realm일 수 있습니다. 단순화를 위해 여기에는 데이터베이스 연결이 구성되어 있지 않으며 각각 user 및 admin 역할에 해당하는 두 명의 사용자(sang/123 및 admin/123)가 직접 구성됩니다.
  • ShiroFilterChainDefinition Bean은 기본 필터링 규칙인 "/login" 및 "/doLogin"으로 구성되며 익명으로 액세스할 수 있고 "/logout"은 로그아웃 요청이며 기타 요청은 액세스하기 전에 인증이 필요합니다
  • Then 로그인 인터페이스 및 페이지 액세스 인터페이스 구성
@Controller
public class UserController {
    @PostMapping("/doLogin")
    public String doLogin(String username, String password, Model model) {
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        Subject subject = SecurityUtils.getSubject();
        try {
            subject.login(token);
        } catch (AuthenticationException e) {
            model.addAttribute("error", "用户名或密码输入错误!");
            return "login";
        }
        return "redirect:/index";
    }
    @RequiresRoles("admin")
    @GetMapping("/admin")
    public String admin() {
        return "admin";
    }
    @RequiresRoles(value = {"admin", "user"}, logical = Logical.OR)
    @GetMapping("/user")
    public String user() {
        return "user";
    }
}

코드 설명:

    doLogin 메소드에서 먼저 UsernamePasswordToken 인스턴스를 빌드한 다음 Subject 객체를 가져오고 객체에서 로그인 메소드를 호출하여 로그인 작업을 수행합니다. 로그인 작업 실행 과정에서 예외가 발생하면 로그인이 실패했음을 의미하며, 로그인에 성공하면 "/index"로 리디렉션됩니다.
  • 다음 , 두 인터페이스 "/admin" 및 "/admin"은 "/user"로 노출됩니다. "/admin" 인터페이스의 경우 "/user" 인터페이스에 액세스하려면 관리자 역할이 있어야 합니다. 액세스하려면 관리자 역할이나 사용자 역할이 있어야 합니다.
  • 다른 역할의 경우 액세스된 인터페이스는 WebMvc
@Configuration
public class WebMvcConfig implements WebMvcConfigurer{
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/login").setViewName("login");
        registry.addViewController("/index").setViewName("index");
        registry.addViewController("/unauthorized").setViewName("unauthorized");
    }
}

에서 직접 구성할 수 있습니다. 다음으로 전역 예외 처리를 위한 전역 예외 처리기를 만듭니다. 승인 예외를 처리하는 것입니다

@ControllerAdvice
public class ExceptionController {
    @ExceptionHandler(AuthorizationException.class)
    public ModelAndView error(AuthorizationException e) {
        ModelAndView mv = new ModelAndView("unauthorized");
        mv.addObject("error", e.getMessage());
        return mv;
    }
}

사용자가 승인되지 않은 리소스에 액세스하면 승인되지 않은 보기로 점프하고 오류 메시지를 전달합니다.

구성이 완료되면 마지막으로 resources/templates 디렉터리에 테스트용 HTML 페이지 5개를 생성하세요.

(1) index.html

<!DOCTYPE html>
<html lang="en" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h4>Hello, <shiro:principal/></h4>
<h4><a href="/logout" rel="external nofollow" >注销登录</a></h4>
<h4><a shiro:hasRole="admin" href="/admin" rel="external nofollow" >管理员页面</a></h4>
<h4><a shiro:hasAnyRoles="admin,user" href="/user" rel="external nofollow" >普通用户页面</a></h4>
</body>
</html>

(2) login.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>
    <form action="/doLogin" method="post">
        <input type="text" name="username"><br>
        <input type="password" name="password"><br>
        <div th:text="${error}"></div>
        <input type="submit" value="登录">
    </form>
</div>
</body>
</html>

(3) user.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h2>普通用户页面</h2>
</body>
</html>

(4) admin.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h2>管理员页面</h2>
</body>
</html>

(5) 무단.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>
    <h4>未获授权,非法访问</h4>
    <h4 th:text="${error}"></h4>
</div>
</body>
</html>

3.

프로젝트를 시작하고 로그인 페이지를 방문하여 sang/123

SpringBoot 보안 관리의 Shiro 프레임워크를 사용하는 방법을 사용하여 로그인하세요. 참고: sang 사용자에게는 관리자 역할이 없으므로 로그인 성공 후 페이지에는 관리자 페이지에 대한 하이퍼링크가 없습니다. .

그런 다음 admin/123을 사용하여 로그인하세요.

SpringBoot 보안 관리의 Shiro 프레임워크를 사용하는 방법사용자가 sang을 사용하여 로그인한 후 http://localhost:8080/admin을 방문하면 승인되지 않은 페이지로 이동합니다

위 내용은 SpringBoot 보안 관리의 Shiro 프레임워크를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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