Shiro 시리즈 의 Shiro+Mysql 사용자 인증 실현(Authentication)

인터넷 에서 Apache Shiro 를 소개 하 는 자 료 는 대부분 ini 파일 의 간단 한 설정 을 예 로 들 어 데이터 베 이 스 를 어떻게 결합 하여 사용자 인증 을 실현 하 는 지 에 대해 서 는 언급 하지 않 는 다.저도 Shiro 를 접 하기 시 작 했 습 니 다.여기 서 입문 단계 인 Shiro+Mysql 의 설정 방법 을 소개 합 니 다.이 방법 은 시작 일 뿐 웹,Spring,Mybatis 등 구조 와 통합 되 지 않 았 습 니 다.앞으로 저 는 여러분 과 제 학습 과정 과 소감 을 계속 공유 하 겠 습 니 다.
 
now we can start the things that we really care about.
 
데이터베이스 에 사용자 표를 만 들 면 필드 가 간단 합 니 다.
CREATE TABLE `sec_user` (
  `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_name` varchar(64) COLLATE utf8_bin DEFAULT NULL,
  `password` varchar(128) COLLATE utf8_bin DEFAULT NULL,
  `created_time` datetime DEFAULT NULL,
  `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin

 표 에 기록 을 삽입 합 니 다.사용자 이름:[email protected],비밀번호:cmao
 
resources 디 렉 터 리 아래 에 ini 파일 을 만 들 고 Shiro 를 설정 합 니 다.(후속 파일 은 이 파일 의 내용 을 XML 파일 로 이동 합 니 다.)이 프로필 에서 저 희 는 데이터 원본 을 설정 하고 사용자 인증 시 데이터베이스 조회 문 구 를 사용 해 야 합 니 다.Shiro 에서 자체 적 으로 가지 고 있 는 JdbcRealm 류 를 사 용 했 습 니 다.
[main]  
dataSource=org.springframework.jdbc.datasource.DriverManagerDataSource
dataSource.driverClassName=com.mysql.jdbc.Driver
dataSource.url=jdbc:mysql://127.0.0.1:3306/YOUR_DATABASE_NAME
dataSource.username=YOUR_USERNAME
dataSource.password=YOUR_PASSWORD

jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.permissionsLookupEnabled = true  
jdbcRealm.dataSource=$dataSource
jdbcRealm.authenticationQuery = SELECT password FROM sec_user WHERE user_name = ?  

securityManager.realms=$jdbcRealm

사용자 인증 에 관 한 조회 문 구 는 제 가 여기 서 몇 마디 더 하 겠 습 니 다.친구 들 은 제 가 수다스럽다 고 싫어 하지 마 세 요.저 희 는 사용자 이름 을 조회 조건 으로 암호 필드 를 조회 하면 됩 니 다.select 뒤에서 별표(*)를 사용 하거나 조회 필드 가 하나 이상 이면 사용자 인증 을 통과 할 수 없습니다. 。
설정 파일 을 다 쓴 후에 우 리 는 테스트 방법 을 써 서 사용자 인증 기능 을 실현 할 수 있 는 지 검증 할 수 있 습 니 다.
 
package com.emerons.learning;

import static org.junit.Assert.*;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.DisabledAccountException;
import org.apache.shiro.authc.ExcessiveAttemptsException;
import org.apache.shiro.authc.ExpiredCredentialsException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class JdbcRealmTest {

	@Before
	public void setUp() throws Exception {
	}

	@After
	public void tearDown() throws Exception {
	}

	@Test
	public void test() {
		// 1.  SecurityManager  ,    ini       SecurityManager
		Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-jdbc-realm.ini");
		// 2.  SecurityManager  ,    SecurityUtils
		SecurityManager sm = factory.getInstance();
		SecurityUtils.setSecurityManager(sm);

		// 3.  Subject
		Subject subject = SecurityUtils.getSubject();
		// 4.        
		UsernamePasswordToken token = new UsernamePasswordToken("[email protected]", "chrismao");
		// 5.  ,              ,          
		try {
			subject.login(token);
			// 6.        
			assertEquals(true, subject.isAuthenticated());
			System.out.println("    !!");
			// 7.    
			subject.logout();
		} catch (IncorrectCredentialsException e) {
			System.out.println("      . Password for account " + token.getPrincipal() + " was incorrect.");
		} catch (ExcessiveAttemptsException e) {
			System.out.println("        ");
		} catch (LockedAccountException e) {
			System.out.println("      . The account for username " + token.getPrincipal() + " was locked.");
		} catch (DisabledAccountException e) {
			System.out.println("      . The account for username " + token.getPrincipal() + " was disabled.");
		} catch (ExpiredCredentialsException e) {
			System.out.println("     . the account for username " + token.getPrincipal() + "  was expired.");
		} catch (UnknownAccountException e) {
			System.out.println("     . There is no user with username of " + token.getPrincipal());
		}
	}

}

 
테스트 코드 를 실행 하여 다음 과 같은 출력 을 얻 을 수 있 습 니 다:
INFO : org.springframework.jdbc.datasource.DriverManagerDataSource - Loaded JDBC driver: com.mysql.jdbc.Driver
INFO : org.apache.shiro.realm.AuthorizingRealm - No cache or cacheManager properties have been set.  Authorization cache cannot be obtained.
INFO : org.apache.shiro.config.IniSecurityManagerFactory - Realms have been explicitly set on the SecurityManager instance - auto-setting of realms will not occur.
INFO : org.apache.shiro.session.mgt.AbstractValidatingSessionManager - Enabling session validation scheduler...
    !!
INFO : org.apache.shiro.realm.AuthorizingRealm - No cache or cacheManager properties have been set.  Authorization cache cannot be obtained.

 로그 에서 볼 수 있 듯 이 프로그램 은 Jdbc 드라이버 를 불 러 오고 realm 을 명확 하 게 지정 합 니 다.이것 은 우리 의 Shiro 프로필 을 불 러 오 는 데 성공 했다 는 것 을 설명 합 니 다.마지막 으로'로그 인 성공'을 보 았 다 는 것 은 이 인증 기능 이 이미 실현 되 었 다 는 것 을 의미한다.테스트 코드 에 사용 할 사용자 이름 이나 비밀 번 호 를 수정 해 보 세 요.콘 솔 에서 아래 와 같은 출력 을 볼 수 있 고 정확 한 이상 을 던 질 수 있 습 니 다.
INFO : org.springframework.jdbc.datasource.DriverManagerDataSource - Loaded JDBC driver: com.mysql.jdbc.Driver
INFO : org.apache.shiro.realm.AuthorizingRealm - No cache or cacheManager properties have been set.  Authorization cache cannot be obtained.
INFO : org.apache.shiro.config.IniSecurityManagerFactory - Realms have been explicitly set on the SecurityManager instance - auto-setting of realms will not occur.
      . Password for account [email protected] was incorrect.

 
이로써 Shiro+Mysql 을 사용 하여 사용자 인증(Authentication)을 실현 하 는 기능 이 완료 되 었 습 니 다.이 를 바탕 으로 캐릭터 권한 수여(Authorization),조작 가능(Permission)등 기능 을 보완 할 수 있 습 니 다.을 참조 하 십시오. 》

좋은 웹페이지 즐겨찾기