(二)shiro认证

认证是用户来证明他们的身份。

subject认证主体,它包含有两个重要信息:

principals:身份,可以是用户名,邮件,手机号码等等,用来表示一个登陆主体身份

Creadentials:凭证,常见有密码,数字证书等。


shiro处理认证流程

(二)shiro认证_第1张图片

第一步:调用Subject.login 方法

第二步:Security Manager负责验证,这是认证起始的地方。

第三步:Authenticator是真正的验证步骤

第四步:Authenticator可能会委托给相应的AuthenticationStrategy进行多Realm身份验证,默认ModularRealmAuthenticator会调用AuthenticationStrategy进行多Realm身份验证

第五步:Authenticator会把相应的token传入Realm,从Realm获取身份验证信息,如果没有返回/抛出异常表示身份验证失败了。此处可以配置多个Realm,将按照相应的顺序及策略进行访问。


Realm:意思是域,ShiroRealm 中获取验证数据;
Realm 有很多种类,例如常见的jdbc realmjndi realmtext realm 


实例演示

为了实现真实数据库验证,在数据库中创建一个数据库命名为db_shiro,创建表名字为users,固定写法否则会报错。

字段如下


1.创建一个maven项目,并在pom.xml文件中,并配置需要用到的jar包


  4.0.0
  com.liy.shiro
  shiro01
  0.0.1-SNAPSHOT
  shiro
  shiro
  
  
  
	
    	org.apache.shiro
    	shiro-core
    	1.3.2
	
  
  

    org.slf4j
    slf4j-log4j12
    1.7.21

  
  

    c3p0
    c3p0
    0.9.1.2

  
  

    commons-logging
    commons-logging
    1.2




    mysql
    mysql-connector-java
    5.1.40
  
  

这里需要数据源c3p0、MySQL的jdbc驱动、commons-logging以及shiro所需要的jar包


2.配置ini文件

命名为jdbc_realm.ini

[main]
#声明一个realm
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
#获取数据源
dataSource=com.mchange.v2.c3p0.ComboPooledDataSource
#配置数据源的基本信息
dataSource.driverClass=com.mysql.jdbc.Driver
dataSource.jdbcUrl=jdbc:mysql://localhost:3306/db_shiro
dataSource.user=root
#密码为空用""代替,否则不能构成一个键值对
dataSource.password=""
#jdbcRealm的数据源设置信息
jdbcRealm.dataSource=$dataSource
#把jdbcRealm赋给securityManager
securityManager.realms=$jdbcRealm
格式:

1.变量名  = 全类名

2.变量名.属性 = 为属性赋值,会调用set方法

3.$变量名 引用之前的一个对象实例 

3.java代码

package com.liy.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 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("liy", "123");
		try {
			//身份认证
			currentUser.login(token);
		
			System.out.println("用户验证成功");
		} catch (AuthenticationException e) {
			e.printStackTrace();
			System.out.println("用户验证失败");
		}
		
		currentUser.logout();
	}
}


重点:引jar包,配置ini文件,数据库表users,java代码的编写




你可能感兴趣的:((二)shiro认证)