【shiro】--- 身份认证

先介绍shiro的身份认证。

一个系统,用户想要登录的话,得经过身份认证才可以。先登录系统,再说这个用户拥有哪些角色,角色拥有哪些权限。

 

认证主体:Subject

 

包含下面两类信息:

  • Principals:身份,可以是用户名,邮件,手机号码等等,用来标识一个登录主体身份;
  • Credentials:凭证,常见有密码,数字证书等等;

 

 

身份认证流程

 

引用:

Subject:主体,代表了当前“用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject,如网络爬虫,机器人等;即一个抽象概念;所有Subject都绑定到SecurityManager,与Subject的所有交互都会委托给SecurityManager;可以把Subject认为是一个门面;SecurityManager才是实际的执行者;

SecurityManager:安全管理器;即所有与安全有关的操作都会与SecurityManager交互;且它管理着所有Subject;可以看出它是Shiro的核心,它负责与后边介绍的其他组件进行交互,如果学习过SpringMVC,你可以把它看成DispatcherServlet前端控制器;

Realm:域,Shiro从从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据源。

 

操作步骤

咱们这次跟数据库相连做权限认证。

1、首先建立数据库:user

里面的内容和上一篇博客中textRealm(shiro.ini)文件中的内容一样。

 

 

2、建立Jdbc_realm.ini文件

 

[main]

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=123456

jdbcRealm.dataSource=$dataSource

securityManager.realms=$jdbcRealm

 

 

3、建立一个类,里面有一个Main方法,让shiro的SecurityManager读取jdbc_realm.ini文件,其他内容和上一篇博客的main方法中的内容一样。

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", "12345");

try{

//身份认证

currentUser.login(token);

System.out.println("身份认证成功!");

}catch(AuthenticationException e){

e.printStackTrace();

System.out.println("身份认证失败!");

}

//退出

currentUser.logout();

}

 

}

 

 

注意:这里如果只在Pom中写shiro相关的dependency是不可以,因为用到了MySQL库,所以得引用MySQL相关的Jar包。

pom文件如下:

<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>

 

猜你喜欢

转载自blog.csdn.net/u013045959/article/details/77168445