Shiro学习笔记(1)——shiro入门

  • 创建一个简单shiro项目
  • Shiro的权限
    • 1 简单字符串
    • 2 多层次管理
    • 2 实例级访问控制

1.创建一个简单shiro项目

  • 创建一个java工程
  • 加入shiro需要的jar包

  • 在src下创建log4j配置文件(非必需步骤,可以跳过)
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
log4j.rootLogger=INFO, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m %n

# General Apache libraries
log4j.logger.org.apache=WARN

# Spring
log4j.logger.org.springframework=WARN

# Default Shiro logging
log4j.logger.org.apache.shiro=TRACE

# Disable verbose logging
log4j.logger.org.apache.shiro.util.ThreadContext=WARN
log4j.logger.org.apache.shiro.cache.ehcache.EhCache=WARN
  • 在src下创建shiro.ini配置文件
[users]
admin = 123,role1
[roles]
role1 = printer:print

用户名:admin

密码:123

为admin这个账户赋予role1角色,多个角色使用逗号隔开

role1这个角色拥有printer:print 这个权限,关于这个权限的写法,后面会讲到

  • HelloWorld
package com.shiro.helloworld;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld {
    //如果不使用日志,也可以直接用System.out.println(),也就可以不用配置log4j.properties了
    private static final transient Logger log = LoggerFactory.getLogger(HelloWorld.class);

    public static void main(String[] args) {
        //获取SecurityManager的实例
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        SecurityManager securityManager = factory.getInstance();

        SecurityUtils.setSecurityManager(securityManager);

        Subject currenUser = SecurityUtils.getSubject();
        //session的使用
        Session session = currenUser.getSession();
        session.setAttribute("key", "value");
        String value = (String) session.getAttribute("key");
        log.info("value:"+value);
        //如果还未认证
        if(!currenUser.isAuthenticated()){
            UsernamePasswordToken token = new UsernamePasswordToken("admin","123");
            token.setRememberMe(true);
            try {
                currenUser.login(token);
            } catch (UnknownAccountException uae) {
                log.info("没有该用户: " + token.getPrincipal());
            } catch (IncorrectCredentialsException ice) {
                log.info( token.getPrincipal() + " 的密码不正确!");
            } catch (LockedAccountException lae) {
                log.info( token.getPrincipal() + " 被锁定 ,请联系管理员");
            }catch (AuthenticationException ae) {
                //其他未知的异常
            }
        }
        if(currenUser.getPrincipal() != null)
            log.info("用户 "+currenUser.getPrincipal() +" 登录成功");
        //是否有role1这个角色
        if(currenUser.hasRole("role1")){
            log.info("有角色role1");
        }else{
            log.info("没有角色role1");
        }
        //是否有对打印机进行打印操作的权限
        if(currenUser.isPermitted("printer:print")){
            log.info("可以对打印机进行打印操作");
        }else {
            log.info("不可以对打印机进行打印操作");
        }
        //退出登录
        currenUser.logout();
        System.exit(0);
    }
}
  • 其实我们使用shiro就为了做两件事:1. 验证用户的身份,2. 验证该用户是否有进行某个操作的权限

运行结果:

2.Shiro的权限

2.1 简单字符串

用简单的字符串来表示一个权限,如:queryPrinter

2.2 多层次管理

  1. printer:print

    其中第一部分是权限被操作的领域(打印机),第二部分是被执行的操作

  2. 多个值

    多个值使用逗号隔开,如role1 = printer:print,printer:query

    不一定要xxx:yyyy的形式,也可以直接使用简单字符串

  3. 可以使用*号表示所有

    比如printer:* ,表示你可以对打印机进行任何操作,

    或者使用 *:query ,表示你在任何领域下,都有查询操作

2.2 实例级访问控制

  1. 这种情况通常会使用三个部件——第一个是域,第二个是操作,第三个是被付诸

    实施的实例。如:printer:query:lp7200

    也可以使用通配符来定义,如:

    printer:print:*

    printer::

    printer:*:lp7200

    printer:query, print:lp7200

  2. 部分省略:缺少的部件意味着用户可以访问所有与之匹配的值

    printer:print 等价于 printer:print:*

    printer 等价于 printer::

    但是请记住:只能从字符串的结尾处省略部件,也就是说

    printer:lp7200 于 并不等价于 printer:*:lp7200

时间: 2024-11-03 11:52:40

Shiro学习笔记(1)——shiro入门的相关文章

Shiro学习笔记(2)——身份验证之Realm

环境准备 什么是Realm 为什么要用Realm 自定义Realm 多个Realm 配置Authenticator和AuthenticationStrategy 自定义AuthenticationStrategy验证策略 多个Realm验证顺序 环境准备 创建java工程 需要的jar包 大家也可以使用maven,参考官网 什么是Realm 在我所看的学习资料中,关于Realm的定义,写了整整一长串,但是对于初学者来说,看定义实在是太头疼了. 对于什么是Realm,我使用过之后,个人总结一下:s

Shiro学习笔记(3)——授权(Authorization)

什么是授权 授权三要素 Shiro的三种授权方式 1 编码方式授权 2 基于注解的授权 3 JSP标签授权 1.什么是授权 授权,就是访问控制,控制某个用户在应用程序中是否有权限做某件事 2.授权三要素 权限 请看Shiro学习笔记(1)--shiro入门中权限部分内容 角色 通常代表一组行为或职责.这些行为演化为你在一个软件应用中能或者不能做的事情.角色通常是分配给用户帐户的,因此,通过分配,用户能够"做"的事情可以归属于各种角色 隐式角色:一个角色代表着一系列的操作,当需要对某一操

Shiro学习笔记(4)——ini 配置

ini 配置文件 在前面三个笔记中也有使用到ini配置文件,但是没有进行详细的解析,本次来介绍一下如何配置. ini配置文件其实和properties配置文件一样的使用方法,都是键值对的形式(key=value),#号代表注释 ini配置中主要配置有四大类:main,users,roles,urls [main] #提供了对根对象 securityManager 及其依赖的配置 securityManager=org.apache.shiro.mgt.DefaultSecurityManager

shiro学习笔记_0600_自定义realm实现授权

博客shiro学习笔记_0400_自定义Realm实现身份认证 介绍了认证,这里介绍授权. 1,仅仅通过配置文件来指定权限不够灵活且不方便.在实际的应用中大多数情况下都是将用户信息,角色信息,权限信息 保存到了数据库中.所以需要从数据库中去获取相关的数据信息.可以使用 shiro 提供的JdbcRealm来实现,,也可以自定义realm来实现.使用jdbcRealm往往也不够灵活.所以在实际应用中大多数情况都是自定义Realm来实现. 2,自定义Realm 需要继承 AuthorizingRea

Apache Shiro学习笔记(六)FilterChain

鲁春利的工作笔记,好记性不如烂笔头 Apache Shiro学习笔记(七)IniWebEnvironment

Shiro学习笔记(5)——web集成

Web集成 shiro配置文件shiroini 界面 webxml最关键 Servlet 測试 基于 Basic 的拦截器身份验证 Web集成 大多数情况.web项目都会集成spring.shiro在普通web项目和spring项目中的配置是不一样的.关于spring-shiro集成,能够參考Shiro学习笔记(3)--授权(Authorization) 中的JSP标签授权部分演示样例代码 本次介绍普通的web项目,不使用不论什么框架. shiro配置文件(shiro.ini) 创建web项目.

现代C++学习笔记之二入门篇2,数据转换

static_cast:    这种强制转换只会在编译时检查. 如果编译器检测到您尝试强制转换完全不兼容的类型,则static_cast会返回错误. 您还可以使用它在基类指针和派生类指针之间强制转换,但是,编译器在无法分辨此类转换在运行时是否是安全的. dynamic_cast: dynamic_cast在运行时检查基类指针和派生类指针之间的强制转换. dynamic_cast 是比 static_cast 更安全的强制类型转换,但运行时检查会带来一些开销. const_cast:    con

MySQL学习笔记之一 MySQL入门

本人之前接触的关系型数据库主要是oracle和sqlserver,而对于mysql知之甚少,但查阅网上资料发现,mysql与oracle非常相似,所以学起来应该不会很费劲,在总结的时候可能更多的把关注点放在它与oracle的不同之处. 一.简介 MySQL是一个真正的多用户.多线程SQL数据库服务器.SQL(结构化查询语言)是世界上最流行的和标准化的数据库语言.MySQL是一个客户端/服务器结构的实现, 它由一个服务器守护程序mysqld和很多不同的客户程序和库组成. MySQL的普及并不局限于

现代C++学习笔记之二入门篇1

现代 C++ 强调: 基于堆栈的范围,而非堆或静态全局范围. 自动类型推理,而非显式类型名称. 智能指针而不是原始指针. std::string 和 std::wstring 类型(请参见 <string>),而非原始 char[] 数组. 标准模板库 (STL) 容器(例如 vector.list 和 map),而非原始数组或自定义容器. 请参见 <vector>.<list> 和 <map>. STL 算法,而非手动编码的算法. 异常,可报告和处理错误条

shiro学习笔记_0100_shiro简介

前言:第一次知道shiro是2016年夏天,做项目时候我要写springmvc的拦截器,申哥看到后,说这个不安全,就给我捣鼓了shiro,我就看了下,从此认识了shiro.此笔记是根据网上的视频教程记录的,shiro的文档感觉不是很好,所以结合老师的讲课和文档,感觉条理更清晰些.以便日后查阅 shiro:Shiro是一个基于java的开源的安全管理框架. Shiro可以帮助我们完成:认证.授权.加密.会话管理.与Web集成.缓存等可用于javase和javaee,还可用于分布式集群环境. 在ja