Shiro——学习笔记(1)

1.核心概念

1.Shiro不会自己去维护用户、维护权限;这些需要我们自己去设计/提供;然后通过相应的接口注入给Shiro。
2.应用代码直接交互的对象是Subject,也就是说Shiro的对外核心是Subject

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

  Security Manager:安全管理器;即所有与安全有关的操作都会与SecurityManager交互;且它管理着所有的Subject,且负责与后面介绍的其他组件进行交互。它是Shiro内部的核心。可以理解为前端控制器。

  Realm:域,Shiro从Realms获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,他需要从Realm获取相应的用户进行比较以确定用户身份是否合法。可以看作是DataSource,即安全数据源。

2.HelloWorld代码:

//获取SecurityManager工厂,此处使用ini配置文件初始化SecurityManager
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-jdbc-realm.ini");
        //得到SecurityManager实例,并绑定给SecurityUtils
        SecurityManager securityManager = factory.getInstance();
        SecurityUtils.setSecurityManager(securityManager);
        //得到Subject及创建用户名/密码身份验证Token
        Subject subject =SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken("zhang","123");
        try {
            //登陆,即身份验证
            subject.login(token);
        }catch (AuthenticationException e)
        {
            //身份验证失败
        }
        System.out.println(subject.isAuthenticated()); //用户已经登陆
        //退出
        subject.logout();

基于ini的验证方式

[users]
zhang=123
wang=132

自定义Realm

package main.realm;

import org.apache.shiro.authc.*;
import org.apache.shiro.realm.Realm;

/**
 * Created by ZY on 2017/9/12.
 */
public class MyRealm implements Realm {

    /**
     * 返回一个唯一的Realm名字
     * @return
     */
    public String getName() {
        return "MyRealm";
    }

    /**
     * 判断此Realms是否支持此Token
     * @param authenticationToken
     * @return
     */
    public boolean supports(AuthenticationToken authenticationToken) {
        //仅支持UsernamePassword类型的Token
        return authenticationToken instanceof UsernamePasswordToken;
    }

    /**
     * 根据Token获取认证信息
     * @param authenticationToken
     * @return
     * @throws AuthenticationException
     */
    public AuthenticationInfo getAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        String username = (String) authenticationToken.getPrincipal(); //得到用户名
        String password =new String((char[])authenticationToken.getCredentials()); //得到密码

        if(!"zha".equals(username))
        {
            throw new UnknownAccountException(); //如果用户名错误
        }
        if(!"123".equals(password))
        {
            throw new IncorrectCredentialsException(); //如果密码错误。
        }
        //如果验证成功,返回一个实现。
        return new SimpleAuthenticationInfo(username,password,getName());
    }
}
myRealm1=main.realm.MyRealm
securityManager.realms=$myRealm1

基于数据库的方式

[main]
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
dataSource=com.alibaba.druid.pool.DruidDataSource
dataSource.driverClassName=com.mysql.jdbc.Driver
dataSource.url=jdbc:mysql://localhost:3306/shiro
dataSource.username=root
dataSource.password=123456
jdbcRealm.dataSource=$dataSource
securityManager.realms=$jdbcRealm

Shiro:学习笔记(1)——身份验证的更多相关文章

  1. Shiro学习笔记总结,附加" 身份认证 "源码案例(一)

    Shiro学习笔记总结 内容介绍: 一.Shiro介绍 二.subject认证主体 三.身份认证流程 四.Realm & JDBC reaml介绍 五.Shiro.ini配置介绍 六.源码案例 ...

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

    Web集成 shiro配置文件shiroini 界面 webxml最关键 Servlet 測试 基于 Basic 的拦截器身份验证 Web集成 大多数情况.web项目都会集成spring.shiro在 ...

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

    博客shiro学习笔记_0400_自定义Realm实现身份认证 介绍了认证,这里介绍授权. 1,仅仅通过配置文件来指定权限不够灵活且不方便.在实际的应用中大多数情况下都是将用户信息,角色信息,权限信息 ...

  4. apache shiro学习笔记

    一.权限概述 1.1 认证与授权 认证:系统提供的用于识别用户身份的功能,通常登录功能就是认证功能-----让系统知道你是谁?? 授权:系统授予用户可以访问哪些功能的许可(证书)----让系统知道你能 ...

  5. Shiro 学习笔记(二)——shiro身份验证

    身份验证: 在应用中证明他就是他本人.一般上用身份证.用户/密码 来证明. 在shiro中,用户需要提供principals (身份)和credentials(证明)给shiro,从而应用能验证用户身 ...

  6. Shiro 学习笔记(一)——shiro简介

    Apache Shiro 是一个安全框架.说白了,就是进行一下 权限校验,判断下这个用户是否登录了,是否有权限去做这件事情. Shiro 可以帮助我们完成:认证.授权.加密.会话管理.与web 集成. ...

  7. MVC4学习笔记之--身份认证过滤器

    过滤器作为MVC模式中面向切面编程应用很广泛,例如身份验证,日志,异常,行为截取等.博客园里面的大神对应过滤器的介绍以及很多,MVC4中不同的过滤器也介绍得很清楚.FlyDragon  辉太 禁止吸烟 ...

  8. Shiro进行简单的身份验证(二)

    一个Realm数据源: shiro.ini: [users] wp=123456 main方法执行认证: package com.wp.shiro; import org.apache.shiro.S ...

  9. Shiro学习笔记六(自定义Reaml-使用数据库设置 user roles permissions)

    1.工程目录 pom文件还和以前设置的一样就是添加了一个数据库驱动, <dependencies> <dependency> <groupId>junit</ ...

随机推荐

  1. Django——基于类的视图(class-based view)

    刚开始的时候,django只有基于函数的视图(Function-based views).为了解决开发视图中繁杂的重复代码,基于函数的通用视图( Funcation-based generic vie ...

  2. STL学习笔记(算法概述)

    算法头文件 要运用C++标准程序库的算法,首先必须包含头文件<algorithm> 使用STL算法时,经常需要用到仿函数以及函数配接器.它们定义域<functional>头文件 ...

  3. 【Excle数据透视表】如何将价格小于5000的显示为红色“不达标”

    例如下图:需要将价格小于5000的设置为低价格 步骤 单击"价格"列任意单元格→右键→数字格式→自定义→在类型下的文本框写入:[>=5000]G/通用格式;[红色][< ...

  4. 【Java】Java_19递归算法

    1.递归算法 A方法调用B方法,我们很容易理解!递归就是:A方法调用A方法!就是自己调用自己,因此我们在设计递归算法时,一定要指明什么时候自己不调用自己.否则,就是个死循环! 1.1递归算法要点 递归 ...

  5. spark插件入门完整版本

    1 在spark项目中添加source folder文件夹,取名为src/plugins/testplugin/src/java 2 在此文件夹下新建包名,取名为com.jivesoftware.sp ...

  6. python 读写数据

    开源标准数据集 —— mnist(手写字符识别) 下载地址:mnist.pkl.gz 1. 使用 python 读取和解析 mnist.pkl.gz import pickle import gzip ...

  7. docker与虚拟化的联系与区别

    虚拟化技术是一个总称,是一系列实现虚拟技术的统称.从广义上来说,虚拟化技术包括了虚拟机技术和容器技术, 所谓虚拟化技术最大的特点就是将一个真实的机器进行虚拟地分割,然后分割出来的部分可以独立使用   ...

  8. angularjs2中的父子组件通信

    父组件模板中引用子组件 // father template: ... <child-item [name] = "fatherItemName" > </chi ...

  9. (一)spark算子 分为3大类

    value类型的算子 处理数据类型为value型的算子(也就是这个算子只处理数据类型为value的数据),可以根据rdd的输入分区与输出分区的关系分为以下几个类型 (1)输入分区与输出分区一对一型 m ...

  10. [转]const指针与指向const的指针

    经常忘记,保存一下.. #include <iostream> using namespace std; int main(int argc, char *argv[]) { ; int ...