Shiro學習之身份驗證

       小編在shiro 學習第一步中寫了對shiro的架構原理,組件的基本認識進行了總結和說明,這篇博客就帶着大家實現shiro學習中的身份認證的兩個例子:

     那麼身份驗證是神馬東西?

    1.subject的認證主體包含兩個信息身份(Principals)和憑證(Credentials);

     2.認證流程如下:

  下面一起來看具體的代碼實現:

-----------------------------身份驗證之HelloWorld實現----------------------------

➷   環境搭建:

    1.maven的配置

       打開eclipse,根據路徑windows-->preference -->Maven-->User  settings 打開下圖中的界面:

       在圖中的紅色框內顯示的配置文件中配置maven中央倉庫的地址;

      2.確保jdk,server,maven配置沒有問題的情況下我們開始建立項目:

➷  項目開發

      1.新建一個maven項目,在pom.xml配置文件中進行如下配置:主要是引入shiro-core和slf4j

<span style="font-size:18px;"><span style="font-size:18px;"><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.java1234.shiro</groupId>
  <artifactId>Shiro01</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>Shiro01</name>
  <description>Shiro01</description>
  <dependencies>
  	<dependency>
		<groupId>org.apache.shiro</groupId>
		<artifactId>shiro-core</artifactId>
		<version>1.2.4</version>
    </dependency>
    <dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-log4j12</artifactId>
		<version>1.7.12</version>
	</dependency>
  </dependencies>
</project></span></span>
      2.新建一個Java類 HelloWorld

<span style="font-size:18px;"><span style="font-size:18px;">package com.java1234.shiro;


import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
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;

public class HelloWorld {
	public static void main(String[] args) {
		//讀取配置文件,初始化SecurityManager工廠
		Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
		//獲取SecurityManager實例
		SecurityManager securityManager = factory.getInstance();
		//把SecurityManager實例綁定到securityUtils
		SecurityUtils.setSecurityManager(securityManager);
		//得到當前執行的用戶
		Subject currentUser =SecurityUtils.getSubject();
		//創建token令牌,用戶名/密碼
		UsernamePasswordToken token =new UsernamePasswordToken("java1234","123456");
		try {
			//身份認證
			currentUser.login(token);
			System.out.println("身份認證成功!");
		} catch (AuthenticationException e) {
			e.printStackTrace();
			System.out.println("身份認證失敗!");
		}
		currentUser.logout();
	}
}</span></span>
   3.新建shiro.ini配置文件,用來存儲用戶名和密碼:

<span style="font-size:18px;">[users]
java1234=123456
jack=123</span>
   4.爲了在控制檯中打印詳細的信息,我們在shiro.ini的路徑中添加 log4j的配置文件:

<span style="font-size:18px;"><span style="font-size:18px;">#
log4j.rootLogger=INFO, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m %n

# General Apache libraries
log4j.logger.org.apache=WARN

# Spring
log4j.logger.org.springframework=WARN

# Default Shiro logging
log4j.logger.org.apache.shiro=TRACE

# Disable verbose logging
log4j.logger.org.apache.shiro.util.ThreadContext=WARN
log4j.logger.org.apache.shiro.cache.ehcache.EhCache=WARN
</span></span>

     最後,我們可以直接運行main方法,我們可以看到“身份認證成功!”或“身份認證失敗!”;

-----------------------------身份驗證之Jdbc_Realm的實現----------------------------

Realm:意思是域,shiro從Realm中獲取驗證數據;

Realm有很多種類,常見的有jdbc realm,jndi realm, text realm

在HelloWorld例子環境的基礎上,我們進行以下操作:

1.pom文件的配置:

<span style="font-size:18px;"><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.java1234.shiro</groupId>
  <artifactId>Shiro01</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>Shiro01</name>
  <description>Shiro01</description>
  <dependencies>
  	<dependency>
		<groupId>org.apache.shiro</groupId>
		<artifactId>shiro-core</artifactId>
		<version>1.2.4</version>
    </dependency>
    <dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-log4j12</artifactId>
		<version>1.7.12</version>
	</dependency>
	<dependency>
		<groupId>c3p0</groupId>
		<artifactId>c3p0</artifactId>
		<version>0.9.1.2</version>
	</dependency>
	<dependency>
		<groupId>commons-logging</groupId>
		<artifactId>commons-logging</artifactId>
		<version>1.2</version>
	</dependency>
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.1.37</version>
	</dependency>
	
  </dependencies>
</project></span>

    2.更新ini文件,添加jdbc_realm.ini文件,該配置文件類似hibernate的配置文件,主要用來

連接目標數據庫及地址,代碼如下:

<span style="font-size:18px;">[main]
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
dataSource=com.mchange.v2.c3p0.ComboPooledDataSource
dataSource.driverClass=com.mysql.jdbc.Driver
dataSource.jdbcUrl=jdbc:mysql://192.168.21.65:3306/db_shiro
dataSource.user=root
dataSource.password=123456
jdbcRealm.dataSource=$dataSource
securityManager.realms=$jdbcRealm</span>
   3.做好上述步驟之後,我們可以編寫測試類了:

<span style="font-size:18px;">package com.java1234.shiro;


import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
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;

public class JdbcRealmTest {
	public static void main(String[] args) {
		//讀取配置文件,初始化SecurityManager工廠
		Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:jdbc_realm.ini");
		//獲取SecurityManager實例
		SecurityManager securityManager = factory.getInstance();
		//把SecurityManager實例綁定到securityUtils
		SecurityUtils.setSecurityManager(securityManager);
		//得到當前執行的用戶
		Subject currentUser =SecurityUtils.getSubject();
		//創建token令牌,用戶名/密碼
		UsernamePasswordToken token =new UsernamePasswordToken("java1234","123456");
		try {
			//身份認證
			currentUser.login(token);
			System.out.println("身份認證成功!");
		} catch (AuthenticationException e) {
			e.printStackTrace();
			System.out.println("身份認證失敗!");
		}
		currentUser.logout();
	}
}
</span>
之後我們運行main方法,可以發現console中不斷打印相關的jar調用信息,並且有“身份認證成功”的提示字樣,說明我們在main方法中編寫的“Java1234”的用戶名對應的密碼的確是“123456”;


     到這裏關於身份認證的兩個例子我們就完成了,道理很簡單,使用main方法來驗證連接的目標數據庫中是否有main方法中編寫的用戶,如果有,說明當前用戶和密碼均正確,否則用戶不存在或密碼不正確;使用這樣的思路shiro就可以帶我們完成更加複雜的身份認證;


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章