Shiro 시리즈 의 Shiro+Mysql 사용자 인증 실현(Authentication)
6240 단어 자바shiroauthrentication
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)등 기능 을 보완 할 수 있 습 니 다.을 참조 하 십시오. 》
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.