Shiro是什么?

Shiro是一个非常强大的,易于使用的,开源的,权限框架。它包括了权限校验,权限授予,会话管理,安全加密等组件

什么时候使用它呢?

如果你是设计RBAC基础系统,需要编写大量用于权限控制的代码时,使用Shiro开源大大减少工作量。

使用到的包:

下载路径:

http://shiro.apache.org/download.html

Shiro结构图:

入门配置:

1.配置流程图

配置文件代码:

注意:配置文件的后缀一定要是  .ini

##[users]   #用于配置用户名信息
## 用户名= 密码, 角色1, 角色2, …, 角色N
##[roles] #用于配置角色信息
## 角色名= 权限1, 权限2, …, 权限N #全部权限使用 * (星号)
[users]
admin=123456,role_admin,role_edu
[roles]
role_admin = user:list,user:create,user:edit,user:delete
role_edu = edu:list,edu:create

测试代码:

package cn.gzsxt.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; public class ShiroTest { public static void main(String[] args) {
//第一步:创建SecurityManager
//shiro框架读取配置文件,如果在源码夹下,需要在前缀加上classpath
IniSecurityManagerFactory imf=new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = imf.createInstance(); //第二步:创建一个身份对象Subject
SecurityUtils.setSecurityManager(securityManager);
Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token =new UsernamePasswordToken("admin1","123456");
//第三步:校验参数
try {
Subject resultSubject = securityManager.login(subject,token );
// System.out.println(resultSubject.getPrincipal());
// boolean hasRole = resultSubject.hasRole("role_admin");
// System.out.println(hasRole); boolean authenticated = resultSubject.isAuthenticated();
System.out.println(authenticated); } catch (AuthenticationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

Realm机制的必要性:

Shiro是通过Realm机制,实现将配置用户信息存放在数据库等储存系统中

通过Realm可以从数据库里面获得用户的验证信息

配置文件代码:

[main]
#声明realm对象
myRealm=cn.gzsxt.realm.MyRealm #指定securityManager的realm对象
securityManager.realms=$myRealm

编写Realm

package cn.gzsxt.realm;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection; public class MyRealm extends AuthorizingRealm{
/**
* 权限校验
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// TODO Auto-generated method stub
System.out.println("账号名:"+token.getPrincipal());
if ("admin".equals(token.getPrincipal())) {
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(token.getPrincipal(),"123",this.getName());
return info;
}
return null;
}
/**
* 权限授权
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection token) {
// TODO Auto-generated method stub
return null;
} }

测试代码:

package cn.gzsxt.shiro;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject; public class ShiroTest { public static void main(String[] args) { IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:Shiro.ini");
SecurityManager securityManager = factory.createInstance();
SecurityUtils.setSecurityManager(securityManager);
Subject subject = SecurityUtils.getSubject(); AuthenticationToken token = new UsernamePasswordToken("admin","123");
Subject resultSubject = securityManager.login(subject, token ); boolean authenticated = resultSubject.isAuthenticated();
System.out.println(authenticated);
}
}

附:加密

先创建一个Md5帮助类,得到加密后的密码,便于测试

md5帮助类代码:

package cn.gzsxt.utils;

import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.util.ByteSource; public class Md5Util { public static void main(String[] args) {
ByteSource salt = ByteSource.Util.bytes("123");
SimpleHash sh = new SimpleHash("md5", "123", salt,1); String target = sh.toString();
System.out.println(target);
} }

Realm处代码

Shiro安全框架的说明及配置入门的更多相关文章

  1. Shiro安全框架【快速入门】就这一篇!

    Shiro 简介 照例又去官网扒了扒介绍: Apache Shiro™ is a powerful and easy-to-use Java security framework that perfo ...

  2. Shiro安全框架入门使用方法

    详见:https://blog.csdn.net/qq_32651225/article/details/77199464 框架介绍Apache Shiro是一个强大且易用的Java安全框架,执行身份 ...

  3. shiro安全框架

    原文:http://blog.csdn.net/boonya/article/details/8233303 可能大家早先会见过 J-security,这个是 Shiro 的前身.在 2009 年 3 ...

  4. Shiro 安全框架详解二(概念+权限案例实现)

    Shiro 安全框架详解二 总结内容 一.登录认证 二.Shiro 授权 1. 概念 2. 授权流程图 三.基于 ini 的授权认证案例实现 1. 实现原理图 2. 实现代码 2.1 添加 maven ...

  5. Shiro 安全框架详解一(概念+登录案例实现)

    shiro 安全框架详细教程 总结内容 一.RBAC 的概念 二.两种常用的权限管理框架 1. Apache Shiro 2. Spring Security 3. Shiro 和 Spring Se ...

  6. Shiro 权限框架使用总结

    我们首先了解下什么是shiro ,Shiro 是 JAVA 世界中新近出现的权限框架,较之 JAAS 和 Spring Security,Shiro 在保持强大功能的同时,还在简单性和灵活性方面拥有巨 ...

  7. thymeleaf模板引擎shiro集成框架

    shiro权限框架.前端验证jsp设计.间tag它只能用于jsp系列模板引擎. 使用最近项目thymeleaf作为前端模板引擎,采用HTML档,未出台shiro的tag lib,假设你想利用这段时间s ...

  8. SpringMVC整合Shiro权限框架

    尊重原创:http://blog.csdn.net/donggua3694857/article/details/52157313 最近在学习Shiro,首先非常感谢开涛大神的<跟我学Shiro ...

  9. SpringBoot集成Shiro安全框架

    跟着我的步骤:先运行起来再说 Spring集成Shiro的GitHub:https://github.com/yueshutong/shiro-imooc 一:导包 <!-- Shiro安全框架 ...

随机推荐

  1. 'utf-8-sig api_res = r.data.decode('utf-8') json_ = json.loads(api_res)

    东莞市 东莞城市标志 东莞城市标志 1985年,广东省东莞县经国务院批准列为珠江三角洲经济开发区,同年9月撤消东莞县,建立(县级)东莞市,1988年1月升格为地级市.东莞市是全国五个不设市辖区的地级市 ...

  2. English-taxonomy

    域.界.门.纲.目.科.属.种 Domain, Kingdom, Phylum, Class, Order, Family, Genus, Species

  3. scrapy-redis debug视频

    前言 在上一篇笔记说过会录个视频帮助理解里面的类方法,现在视频来了.只录了debug scheduler.py里面的类方法,还有spiders.py里面的类方法差不多,就不说了,自己动手丰衣足食.限于 ...

  4. 【GIS数据格式】ArcInfo Binary Grid Format

    最近在修改项目时发现有些提取的坡度数据在参与了下一步计算后会出错,仔细跟了代码之后发现AE生成的坡度数据和其他一些分析后的栅格都被存储为.adf文件.说起惭愧,并不了解这是什么数据,由于下层算法使用G ...

  5. Python笔记(十六)_else语句、with语句

    else的多种用法 1.try except + else:检测到代码无异常,才执行else 例如: def func(num): count=num//2 while count>1: if ...

  6. Normal Equation Algorithm求解多元线性回归的Octave仿真

    Normal Equation算法及其简洁,仅需一步即可计算出theta的取值,实现如下: function [theta] = normalEqn(X, y) theta = zeros(size( ...

  7. css圣杯布局

    HTML <div class="container"> <div class="content">content</div> ...

  8. 炫酷CSS3加载动画

    <!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8&qu ...

  9. Object.watch

    /*  * object.watch polyfill  *  * 2012-04-03  *  * By Eli Grey, http://eligrey.com  * Public Domain. ...

  10. [Linux] 019 软件包管理简介

    1. 软件包分类 源码包 脚本安装包 二进制包(RPM 包.系统默认包) 2. 源码包 (1)源码包的优点 开源,如果有足够的能力,可以修改源代码 可以自由选择所需的功能 软件是编译安装,所以更加适合 ...