当前位置: 首页 > 编程日记 > 正文

shiro实战系列(一)之入门实战

一、什么是shiro?

Apache Shiro 是一个强大而灵活的开源安全框架,它干净利落地处理身份认证,授权,企业会话管理和加密。   Apache Shiro 的首要目标是易于使用和理解。安全有时候是很复杂的,甚至是痛苦的,但它没有必要这样。框架应 该尽可能掩盖复杂的地方,露出一个干净而直观的 API,来简化开发人员在使他们的应用程序安全上的努力。

二、shiro可以做什么?

 验证用户来核实他们的身份。

 对用户执行访问控制,

如:

(1) 判断用户是否被分配了一个确定的安全角色

(2)判断用户是否被允许做某事

 在任何环境下使用 Session API,即使没有 Web 或 EJB 容器。

 在身份验证,访问控制期间或在会话的生命周期,对事件作出反应。

 聚集一个或多个用户安全数据的数据源,并作为一个单一的复合用户“视图”。

 启用单点登录(SSO)功能。

 为没有关联到登录的用户启用"Remember Me"服务。

Shiro 视图在所有应用程序环境下实现这些目标——从最简单的命令行应用程序到最大的企业应用,不强制依赖其 他第三方框架,容器,或应用服务器。当然,该项目的目标是尽可能地融入到这些环境,但它能够在任何环境下立 即可用。

三、shiro结构图

Shiro 把 Shiro 开发团队称为“应用程序的四大基石”——身份验证,授权,会话管理和加密作为其目标。

shiro核心四要素,简单的概述为认证,授权,会话,加密等。

 Authentication:有时也简称为“登录”,这是一个证明用户是他们所说的他们是谁的行为。

 Authorization:访问控制的过程,也就是绝对“谁”去访问“什么”。

 Session Management:管理用户特定的会话,即使在非 Web 或 EJB 应用程序。

 Cryptography:通过使用加密算法保持数据安全同时易于使用。

额外的功能概述:

 Web Support:Shiro 的 web 支持的 API 能够轻松地帮助保护 Web 应用程序。

 Caching:缓存是 Apache Shiro 中的第一层公民,来确保安全操作快速而又高效。

 Concurrency:Apache Shiro 利用它的并发特性来支持多线程应用程序。

 Testing:测试支持的存在来帮助你编写单元测试和集成测试,并确保你的能够如预期的一样安全。

 "Run As":一个允许用户假设为另一个用户身份(如果允许)的功能,有时候在管理脚本很有用。

 "Remember Me":在会话中记住用户的身份,所以他们只需要在强制时候登录。

四、简单的使用程序

示例为maven工程,jdk8,maven3以上

(1)pom依赖

<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>org.apache.shiro.tutorials</groupId><artifactId>shiro-tutorial</artifactId><version>0.0.1-SNAPSHOT</version><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies>

      <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.5</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.5</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.1.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.0.2</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin><plugin><groupId>org.codehaus.mojo</groupId><artifactId>exec-maven-plugin</artifactId><version>1.1</version><executions><execution><goals><goal>java</goal></goals></execution></executions><configuration><classpathScope>test</classpathScope><mainClass>Tutorial</mainClass></configuration></plugin></plugins></build></project>

logger4j.properties配置文件内容:

如果不加入,将无法看到log4j日志打印的结果

#config root logger
log4j.rootLogger = INFO,system.out
log4j.appender.system.out=org.apache.log4j.ConsoleAppender
log4j.appender.system.out.layout=org.apache.log4j.PatternLayout
log4j.appender.system.out.layout.ConversionPattern=[Log]%-d{yyyy-MM-dd HH:mm:ss} %5p[%F:%L]:%m%n
#log4j.appender.system.out.layout.ConversionPattern=[Log] %5p[%F:%L]:%m%n#config this Project.file logger
log4j.logger.thisProject.file=INFO,thisProject.file.out
log4j.appender.thisProject.file.out=org.apache.log4j.DailyRollingFileAppender
log4j.appender.thisProject.file.out.File=pmslogout.log
log4j.appender.thisProject.file.out.layout=org.apache.log4j.PatternLayout
log4j.appender.thisProject.file.out.layout.ConversionPattern=[Log]%-d{yyyy-MM-dd HH:mm:ss} %5p[%F:%L]:%m%n
log4j.appender.thisProject.file.append=true

(2)运行main方法

import org.apache.log4j.Logger;

public class Tutorial {


    

    private static Logger logger = Logger.getLogger(Tutorial.class);
    
    public static void main(String[] args) {
    
        logger.info("Hello Wolrd Apache Shiro Application");
        System.exit(0);
    }
    }

Enable Shiro

在应用程序中启用 Shiro 最先要明白的事情是几乎在 Shiro 中的每个东西都与一个名为 SecurityManager 的主要的/核 心的组件有关。对于那些熟悉 Java 安全的人来说,这是 Shiro 的 SecurityManager 概念——它不等同于 java.lang.SecurityManager。

现在了解 Shiro 的 SecurityManager 是应用程序的 Shiro 环境的核心及每个应用程序中必须存在一个 SecurityManager 是很有益处的。因此,在我们的实战系列应用程序中第一 件要做的事情就是配置 SecurityManager 实例。

Configuration

虽然我们能够直接实例化一个 SecurityManager 类,但 Shiro 的 SecurityManager 实现有足够的配置选项及内置组件 使得在 Java 源代码做这件事情变得较为痛苦——如果使用一个灵活的基于文本的配置格式来配置 SecurityManager, 那么这将是一件很容易的事情。

为此,Shiro 通过基于文本的 INI 配置文件提供了一个默认的"共性(common denominator)"解决方案。近来人们已 经相当厌倦了使用笨重的 XML 文件,且 INI 文件易于阅读,使用简单,依赖性低。你稍后将会看到有了对象导航图 的简单理解,INI 文件能够有效地被用来配置简单的对象图,如 SecurityManager。

Many Configuration Options

Shiro 的 SecurityManager 实现及所有支持组件都是兼容 JavaBean 的。这允许 Shiro 能够与几乎任何配置格式如 XML(Spring,JBoss,Guice 等等),YAML,JSON,Groovy Builder markup,以及更多配置被一起配置。INI 文件只是 Shiro 的“共性”格式,他它允许任何环境下的配置,除非其他选项不可用。

上面的简单应用仅仅只是证明加入shiro相关的依赖运行没问题,下面进入简单的真正实战

shiro.ini文件

权限角色相关的规则就在该文件中编写:

[user]
root = secret,admin
guest = guest,guest
presidentskroob = 12345,president
darkhelmet = ludicrousspeed,darklord,schwartz
lonestarr=vespa,goodguy,schwartz[roles]
admin = *j
schwartz = lightsaber:*
goodguy = winnebago:drive:eagle5

main方法运行:

import org.apache.log4j.Logger;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.util.Factory;public class Tutorial {private static Logger logger = Logger.getLogger(Tutorial.class);public static void main(String[] args) {logger.info("My First Apache Shiro Application");/***步骤一: 我们使用 Shiro 的 IniSecurityManager 实现来提取我们的 shiro.ini 文件,它位于 classpath 的根目录。* 该实现反映了 Shiro 对工厂设计模式的支持。* classpath: 前缀是一个资源定位符,用来告诉 shiro 去哪加载 ini 文件(其 他前缀,如 url:和 file:也同样被支持)。 */Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");/*** 步骤二: factory.getInstance()方法被调用,它来解析 INI 文件并返回反映该配置的 SecurityManager 实例。 */SecurityManager securityManager = factory.getInstance();/*** * 步骤三: 在这个简单的例子中,我们把 SecurityManager 设置为一个静态的(memory)单例,能够跨 JVM 访问。* 但请 注意,这是不可取的,如果你在单个的 JVM 只中会有不只一个启用 Shiro 的应用程序。对于这个简单的例子 而言,这是没有问题的,但更为复杂的应用程序环境通常将 SecurityManager * 置于应用程序特定的存储中(如 在 Web 应用中的 ServletContext 或 Spring,Guice 后 JBoss DI 容器实例)。*/SecurityUtils.setSecurityManager(securityManager);System.exit(0);}}

Apache Shiro简单的权限管理框架,无论是在github还是码云上,看过不少项目,基本都采取了shiro作为权限控制,spring securty,这个玩意,spring本身集成,不过它并没有shiro好理解,当然掌握好shiro对于理解spring security是非常有帮助的。


转载于:https://www.cnblogs.com/youcong/p/9125317.html

相关文章:

数据源和连接池

JDBC数据源&#xff1a; Data Source JDBC中提供了javax.sql.DataSource接口&#xff0c;负责建立与数据库的连接 DataSource对象可以由Web服务器提供&#xff0c;前提是需要在服务器配置DataSource&#xff08;包括连接池&#xff09; 连接池&#xff1a;Connection Pool…

FastReport.net 使用 Winform WebForm打印

delphi用的fastreport比较多 所以。net中也研究一下用法,这个打印控件还是很简单的 只要手动设计一下写少许代码就可以打印了 甚至可以写成通用代码 以后就可以不用写代码 安装demo会同时安一个设计器 打开设计器 通过设计器设计模板 新建数据源 新建数据集 查询单表全部内容&…

Ubuntu 12.04安装Sun JDK 6

Ubuntu 12.04安装Sun JDK 6 下载 sun jdk 6 bin. 设置权限 chmod x jdk-6u25-linux-i586.bin 解压文件 ./jdk-6u25-linux-i586.bin 移动位置到 sudo mv jdk1.6.0_25 /usr/lib/jvm/ 设置系统环境 sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.6.…

如果你的云服务商倒闭该怎么办?

如果你的云服务商倒闭或暂时中断服务&#xff0c;以下4个步骤能够帮助你的企业把损失减少到最低。 2009年2月&#xff0c;云服务商Coghead在一封写给客户的电子邮件中宣布该公司"由于受到经济挑战的影响"&#xff0c;将立即终止基于云的开发平台服务。随后&#xff0…

Ubuntu16.04桌面系统如何配置和启动wireshark

上一篇介绍了在Ubuntu系统中安装wireshark 本篇介绍在Ubuntu系统中配置和启动wireshark&#xff1b; 安装好后&#xff0c;直接在终端运行$ wireshark。出于安全方面的考虑&#xff0c;普通用户不能够打开网卡设备进行抓包&#xff0c;Wireshark不建议用户通过sudo在root权限下…

[导入]笔记本”终极“散热方案

笔记本老了&#xff0c;三年了&#xff0c;电池不太行了&#xff0c;散热量也大。解决电池问题首先是能耗的问题&#xff0c;我把能够卸下来的光驱和读卡器都拆了&#xff0c;这下留了一个大长孔&#xff0c;很好的是这样散热问题也得到了解决&#xff0c;光驱的大孔和读卡器那…

Android中Broadcast

前一段时间&#xff0c;听说过android的广播&#xff0c;这段时间经过研究终于可以写出一个Demo 首先新建一个android工程项目 在BroadCastActivity.java中 package com.mypack;import android.app.Activity; import android.content.Intent; import android.os.Bundle; import…

java web三大组件之filter过滤器

过滤器是java web中相当重要的组成成分&#xff0c;是JavaWeb三大组件之一&#xff0c;它与Servlet很相似。不过过滤器有以下三条特性&#xff1a; 过滤器是用来拦截请求的&#xff0c;而不是处理请求的。当用户请求某个Servlet时&#xff0c;会先执行部署在这个请求上的Filte…

Permission denied: make_sock: could not bind to address [::]:81 Apache 虚拟主机

想建立一个测试用的虚拟主机&#xff0c;遇到了这个问题&#xff1a; [rootlocalhost html]# service httpd start Starting httpd: httpd: Could not reliably determine the servers fully qualified domain name, using localhost.termwikidev for ServerName (13)Permissio…

E: GPG 错误:http://developer.download.nvidia.com Release: 下列签名无效: NODATA 1 NODATA 2...

参考链接&#xff1a;https://github.com/NVIDIA/nvidia-docker/issues/571 在安装CUDA的时候出现的问题&#xff0c;根本原因是各位都懂的地区局域网特色&#xff0c;我试了很多方法&#xff0c;结果还是Github上一个老铁提出的一个简单方法&#xff1a;修改/etc/apt/sources.…

spring 框架学习(一)

1、spring简介 Spring 是一个开源框架&#xff0c;是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构&#xff0c;分层架构允许您选择使用哪一个组件&#xff0c;同时为 J2EE 应用程序开发提供集成的框架。Spring的一个最大的目的就是使JAVA EE开发…

Styling with the DataGridColumnStyle

详细讲解了如何自定义DataGrid控件&#xff0c;将多种控件&#xff08;如&#xff1a;进度条、按钮、下拉框&#xff09;绑定到数据列中 参考MSDNPart 1&#xff1a;http://msdn.microsoft.com/en-us/library/ms996449Part 2&#xff1a;http://msdn.microsoft.com/en-us/libra…

Excel常用公式记录

1.生成指定时间段内的日期&#xff1a; TEXT("2019/8/9 00:00"RAND()*54,"yyyy/mm/hh HH:MM") 注意&#xff1a;RAND()*54&#xff0c;54指从2019/8/9日起的54天&#xff0c;有时会有2019/8/00的错误格式 2.生成类似于“第一级”&#xff0c;“第二级”类似…

Delphi XE2 发布了,期待了很久的东西,开始学习中。

这个博客将记录我学习DELPHI XE2及开发相关应用程序的点点滴滴&#xff0c;因此该博客内容全部原创&#xff0c;我也不会转载和抄录别人的代码。为了让大家和我一同进步&#xff0c;所有示例都带源代码&#xff0c;你可以随时下载后进行调试运行。 Delphi--一个伴随我12年的开发…

基于libmad库的MP3解码简析

基于libmad库的MP3解码简析 MAD &#xff08;libmad&#xff09;是一个开源的高精度 MPEG 音频解码库&#xff0c;支持 MPEG-1&#xff08;Layer I, Layer II 和 LayerIII&#xff08;也就是 MP3&#xff09;。LIBMAD 提供 24-bit 的 PCM 输出&#xff0c;完全是定点计算&#…

oracle数据库增加新字段

--Add/modify columns alter table 表名 add 字段名 类型; --------------------------------------------------------------------- --Add comments to the columns comment on column CE00.eec000 is xxx;转载于:https://www.cnblogs.com/yby120/p/9138801.html

list @size 验证_第33期:上海自来水来自海上,回文字符串验证!

我准备了 1000 本电子书和计算机各领域高清思维导图 100 张&#xff0c;关注后回复【资源】&#xff0c;即可获取&#xff01;更可回复【内推】加入 BAT 内推群&#xff01;01、题目示例见微知著&#xff0c;发现一组数据很有趣&#xff0c;分享给大家。leetcode 第一题通过次数…

安装apache的时候80端口被PID为4的系统进程所占用

由于工作中需要直接从MySQL后台读取数据&#xff0c;所以安装了PHPnow&#xff0c;装的过程中提示Apache安装失败&#xff0c;80端口被占用。 在cmd中输入netstat –ano命令&#xff0c;发现80端口被一个PID为4的服务所占用&#xff0c;打开任务管理器&#xff0c;发现PID为4的…

PHP根据时间戳返回星期几

为什么80%的码农都做不了架构师&#xff1f;>>> <?php /*** 根据时间戳返回星期几* param string $time 时间戳* return 星期几*/ function weekday($time) {if(is_numeric($time)){$weekday array(星期日,星期一,星期二,星期三,星期四,星期五,星期六);return…

FastCGI与php-fpm

FastCGI&#xff1a;为了兼顾IIS下PHP的效率和安全&#xff0c;微软给出了FastCGI的解决方案。同ISAPI原理有些类似&#xff0c;就是减少CGI初始化等前置操作的消耗。FastCGI可以让PHP的进程重复利用而不是每一个新的请求就重开一个进程。同时FastCGI也可以允许几个进程同时执行…

postmaster.c 中的 ListenAddresses

在 postmaster.c 中看到这种代码&#xff0c;从Java程序员的角度&#xff0c;看起来是很不爽的: char *ListenAddresses; ...if (ListenAddresses){ char *rawstring; List *elemlist; ListCell *l; ... 到底何…

PHPCMS V9 杂记一

PHPCMS V9加载顺序 PHPCMS V9和V8相比&#xff0c;总体思路方向是一样&#xff0c;不同的是V9把OOP和MVC结合得更加完美。 打开根目录下面的index.php 三行代码&#xff0c;相比V8的 index.php来说 更加清楚&#xff0c; phpcms下面的base.php文件&#xff0c;是一个基础类&…

esp32 camera_利用Phyphox和ESP32蓝牙制作欧姆表测电阻

近日&#xff0c;微主在利用Phyphox和ESP32蓝牙研究热敏电阻的阻值与温度的关系时&#xff0c;需要绘制热敏电阻阻值与时间的关系图像&#xff0c;通过用手捏住或者放开热敏电阻&#xff0c;观察电阻与时间关系图像的变化情况&#xff0c;进而了解温度对热敏电阻的影响。将热敏…

linux tomcat集群配置笔记

趁最后一天假期,配置linux环境下的apache集群,巩固下,免的以后用到又忘记,网上东拼息凑,环境弄好后,整到blog,以便以后用到。 参考来源&#xff1a;http://www.linuxidc.com/Linux/2011-03/32859.htm 我用的版本&#xff1a; httpd-2.2.21.tar.gz apache-tomcat-6.0.32.tar.gz …

spring -- 自定义注解

我们直接通过代码解释自定义注解的使用及各个含义 package com.sysware.cloud.dts.annotation;import java.lang.annotation.*;Retention(RetentionPolicy.RUNTIME) Target({ElementType.METHOD}) Inherited Documented public interface DtTransactional {/** Whether need to…

angular 字符串转换成数字_蓝盟IT外包,Python算法的一般技术和嵌入式库|python|字符串|key|算法|调用...

近年来&#xff0c;随着python着火&#xff0c;python也开始受到很多程序员的喜爱。 很多程序员已经开始使用python作为第一语言。最近在python上刷问题时&#xff0c;我想去找python的刷问题常用库api和刷问题技术。 和c的STL库文档一样&#xff0c;但很遗憾没有找到。 因此&a…

Mapping Persistence Classes 笔记2---ValueType的形式和映射

2010年5月17日 简介&#xff1a; 前面的笔记着重讲解了实体类以及其class-mapping options&#xff0c;本章笔记将关注值类型的形式以及其OR映射选项。 值类型一般可分为两类&#xff1a;JDK类型和用户自定义类型。本章首先从实体类的使用JDK类型的properties开始&#xff0c;讲…

安装wampserver及配置php,phpmyadmin遇到的问题及解决方法

wampserver 安装好以后&#xff0c;打开&#xff0c;发现appache无法启动&#xff0c;查了一下&#xff0c;发现是前安装过iis&#xff0c;iis使用80端口&#xff0c;打开httpd.conf&#xff0c;把里面所有的80都改成了81&#xff0c;然后appache就可以正常启动了。 再配置wamp…

as一种模拟输入效果

这个小程序展现的是一种模拟输入的效果&#xff0c;比如你在键盘上随便输入什么&#xff0c;在屏幕上就会依次的显示“这句话不是我输入的&#xff0c;呵呵”。比较有意思。 var s:Sprite new Sprite; var t:TextField new TextField(); var i:Number0; var myText:String&qu…

signature验证/salt验证/token验证的作用

1.salt验证: salt是随机生成的一串字符,salt验证的作用是将生成的salt与加密的密码密文拼接后再次加密存储 这样可以是存储在数据库中的密码更加安全 2.signature验证: I、将token, timestamp, nonce, encrypt的内容按照大小字母顺序排列 II、按顺序将列表中排序号的内容拼接成…