SpringBoot Shiro 통합 로그 인 인증 방법

안전 한 곳 이 없습니다.방학 을 틈 타 Shiro 문 서 를 읽 고 Shiro 통합 Spring Boot 가 데이터베이스 에서 캐릭터 에 따라 접근 할 수 있 는 권한 을 기록 하 였 습 니 다.
간단 한 소개
Apache Shiro 는 강력 하고 유연 하 며 개 원 된 보안 프레임 워 크 입 니 다.그것 은 인증,권한 수여,기업 세 션 관리 와 암호 화 를 깔끔하게 처리 할 수 있다.

위의 그림 은 Shiro 의 기본 구조 입 니 다.
인증(인증)
때로는'로그 인'이 라 고 불 리 며 사용자 가 자신 임 을 증명 하 는 데 쓰 인 다.
인증(권한 부여)
접근 제어 과정,즉"누구"가"무엇"에 접근 하 는 지 확인 합 니 다.
세 션 관리(세 션 관리)
사용자 의 특정한 세 션 을 관리 합 니 다.Shiro 에서 모든 사용자 의 세 션 정 보 를 Shiro 에서 제어 할 수 있 습 니 다.
암호 화(암호 화)
데이터 원본 에 암호 화 알고리즘 을 사용 하여 암호 화 하 는 동시에 쉽게 사용 할 수 있 도록 합 니 다.
Start
환경.
Spring Boot 1.5.9 MySQL 5.7 Maven 3.5.2 Spring Data Jpa Lombok
의존 도 를 높이다
여 기 는 주요 Shiro 의존 만 드 립 니 다.

 <dependency>
   <groupId>org.apache.shiro</groupId>
   <artifactId>shiro-spring-boot-starter</artifactId>
   <version>1.4.0-RC2</version>
  </dependency>
배치 하 다.
저 희 는 잠시 사용자 시트,캐릭터 시트 만 필요 합 니 다.Spring boot 에서 설정 파일 을 수정 하면 자동 으로 데이터베이스 시트 를 만 들 수 있 습 니 다.

server:
 port: 8888
spring:
 datasource:
 driver-class-name: com.mysql.jdbc.Driver
 username: root
 password: root
 url: jdbc:mysql://localhost:3306/shiro?characterEncoding=utf-8&useSSL=false
 jpa:
 generate-ddl: true
 hibernate:
  ddl-auto: update
 show-sql: true
실체
Role.java

@Data
@Entity
public class Role {

 @Id
 @GeneratedValue
 private Integer id;

 private Long userId;

 private String role;

}

User.java

@Data
@Entity
public class User {
 @Id
 @GeneratedValue
 private Long id;

 private String username;

 private String password;

}

Realm
먼저 Realm 클래스 를 만 들 고 Authorizing Realm 에서 계승 하여 우리 자신의 권한 수여 와 인증 방법 을 사용자 정의 합 니 다.Realm 은 프로그램 에 지정 한 보안 데이터(예 를 들 어 사용자,역할,권한)에 접근 할 수 있 는 구성 요소 입 니 다.
Realm.java

public class Realm extends AuthorizingRealm {

 @Autowired
 private UserService userService;
 
 //  
 @Override
 protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
 //         
 String username = (String) SecurityUtils.getSubject().getPrincipal();
 //           
 User user = userService.getUserByUserName(username);
 //         
 List<Role> list = roleService.findByUserId(user.getId());
 SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
 for (Role role : list) {
 //      
 info.addStringPermission(role.getRole());
 }
 return info;
 }

 //  
 @Override
 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {

 //          
 String username = (String) authenticationToken.getPrincipal();

 //              
 User user = userService.getUserByUserName(username);
 if (userService.getUserByUserName(username) == null) {
 throw new UnknownAccountException(
  "                。");
 }

 SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(),getName());
 return info;
 }

}

Shiro 설정 클래스
ShiroConfig.java

@Configuration
public class ShiroConfig {
 @Bean
 public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
 ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
 shiroFilterFactoryBean.setSecurityManager(securityManager);
 Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
 //      ,     ,  /**     
 //       
 filterChainDefinitionMap.put("/favicon.ico", "anon");//    
 filterChainDefinitionMap.put("/**", "authc");
 shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
 return shiroFilterFactoryBean;
 }

@Bean
 public DefaultWebSecurityManager securityManager() {
 DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager(myRealm());
 return defaultWebSecurityManager;
 }

 @Bean
 public MyRealm myRealm() {
 MyRealm myRealm = new MyRealm();
 return myRealm;
 }
}
컨트롤 러
UserController.java

@Controller
public class UserController {

 @Autowired
 private UserService userService;

 @GetMapping("/")
 public String index() {
 return "index";
 }

 @GetMapping("/login")
 public String toLogin() {
 return "login";
 }

 @GetMapping("/admin")
 public String admin() {
 return "admin";
 }

 @PostMapping("/login")
 public String doLogin(String username, String password) {
 UsernamePasswordToken token = new UsernamePasswordToken(username, password);
 Subject subject = SecurityUtils.getSubject();
 try {
 subject.login(token);
 } catch (Exception e) {
 e.printStackTrace();
 }
 return "redirect:admin";
 }

 @GetMapping("/home")
 public String home() {
 Subject subject = SecurityUtils.getSubject();
 try {
 subject.checkPermission("admin");
 } catch (UnauthorizedException exception) {
 System.out.println("       ");
 }
 return "home";
 }

 @GetMapping("/logout")
 public String logout() {
 return "index";
 }
}
Service
UserService.java

@Service
public class UserService {

 @Autowired
 private UserDao userDao;

 public User getUserByUserName(String username) {
 return userDao.findByUsername(username);
 }

 @RequiresRoles("admin")
 public void send() {
 System.out.println("       admin,        ");
 }
}
전시 층
admin.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<html lang="en"/>
<head>
 <meta charset="UTF-8"/>
 <title>Title</title>
</head>
<body>

<form action="/login" method="post">
 <input type="text" name="username" />
 <input type="password" name="password" />
 <input type="submit" value="  " />
</form>
</body>
</html>
home.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<html lang="en"/>
<head>
 <meta charset="UTF-8"/>
 <title>Title</title>
</head>
<body>
home
</body>
</html>
index.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<html lang="en"/>
<head>
 <meta charset="UTF-8"/>
 <title>Title</title>
</head>
<body>
index
<a href="/login" rel="external nofollow" >   </a>
</body>
</html>
login.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<html lang="en"/>
<head>
 <meta charset="UTF-8"/>
 <title>Title</title>
</head>
<body>

<form action="/login" method="post">
 <input type="text" name="username" />
 <input type="password" name="password" />
 <input type="submit" value="  " />
</form>

</body>
</html>
총결산
이 작은 사례 는 역할 에 따라 사용자 의 방문 을 통제 하 는 것 을 실현 했다.그 중에서 가장 중요 한 것 은 Realm 이다.이 는 Shiro 와 응용 안전 데이터 간 의'교량'또는'커 넥 터'역할 을 한다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기