前言
参考百度上说的Apache Shiro是一个强大易用的java安全框架,提供了认证、授权、加密和会话管理功能,可以为任何应用提供安全保障,而其主要为解决以下四个问题:
1、 认证-用户身份识别,常被称为用户登录
2、 授权-访问控制
3、 密码加密-保护或隐藏数据防止被偷窥
4、 会话管理-每用户相关的时间敏感的状态
身份认证流程
以下是从其官网上截取的原理图
Subject认证主体
其中认证主体包含两个信息:
Principals: 身份,可以是用户名,邮件,手机号码等等,用来标识一个登陆主体身份;
Credentials: 凭证,常见有密码,数字证书等等;
Realm&JDBC&Reaml
Realm:意思是域,Shiro从Reaml中获取验证数据;
Realm有很多种类,例如常见的jdbc realm
码上有戏
1.在eclipse中新建一个maven工程,并且配置pom.xml
主要配置如下:
主要有shiro的核心包、日志包,数据源及数据库连接包
- 在resource包下新建jdbc_realm.ini用于配置从数据库中获取验证数据12345678910111213141516[main] //声明以下是代码片段//相当于new了一个jdbcRealm类jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm//声明一个数据源,这里用了c3p0dataSource=com.mchange.v2.c3p0.ComboPooledDataSource//声明驱动dataSource.driverClass=com.mysql.jdbc.Driver//声明url,其中localhost可更改为ip地址dataSource.jdbcUrl=jdbc:mysql://localhost:9806/db_shiro//配置数据库用户名、密码dataSource.user=rootdataSource.password=root//添加数据源jdbcRealm.dataSource=$dataSource//添加数据域securityManager.realms=$jdbcRealm
这里数据库中需要注意的是,数据库中的表名必须为users,并且字段必须为userName和password
- 在src/main/java文件下新建一个HelloWorld类,目前数据这里手动构造一个123456789101112131415161718192021222324252627282930313233343536package com.zwl.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:jdbc_realm.ini");//获取SecurityManager实例SecurityManager securityManager=factory.getInstance();//把SecurityManager实例绑定到SecurityUtilsSecurityUtils.setSecurityManager(securityManager);//得到当前执行的用户Subject currentUser=SecurityUtils.getSubject();//创建token令牌,用户名/密码UsernamePasswordToken token=new UsernamePasswordToken("admin", "123456");try {//身份认证currentUser.login(token);System.out.println("身份认证成功!");} catch (AuthenticationException e) {e.printStackTrace();System.out.println("身份认证失败!");}// 退出currentUser.logout();}}
这里通过更改token来模拟验证数据是否正确
相关源代码,已放在github