Shiro:学习笔记(1)——身份验证
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)——身份验证的更多相关文章
- Shiro学习笔记总结,附加" 身份认证 "源码案例(一)
Shiro学习笔记总结 内容介绍: 一.Shiro介绍 二.subject认证主体 三.身份认证流程 四.Realm & JDBC reaml介绍 五.Shiro.ini配置介绍 六.源码案例 ...
- Shiro学习笔记(5)——web集成
Web集成 shiro配置文件shiroini 界面 webxml最关键 Servlet 測试 基于 Basic 的拦截器身份验证 Web集成 大多数情况.web项目都会集成spring.shiro在 ...
- shiro学习笔记_0600_自定义realm实现授权
博客shiro学习笔记_0400_自定义Realm实现身份认证 介绍了认证,这里介绍授权. 1,仅仅通过配置文件来指定权限不够灵活且不方便.在实际的应用中大多数情况下都是将用户信息,角色信息,权限信息 ...
- apache shiro学习笔记
一.权限概述 1.1 认证与授权 认证:系统提供的用于识别用户身份的功能,通常登录功能就是认证功能-----让系统知道你是谁?? 授权:系统授予用户可以访问哪些功能的许可(证书)----让系统知道你能 ...
- Shiro 学习笔记(二)——shiro身份验证
身份验证: 在应用中证明他就是他本人.一般上用身份证.用户/密码 来证明. 在shiro中,用户需要提供principals (身份)和credentials(证明)给shiro,从而应用能验证用户身 ...
- Shiro 学习笔记(一)——shiro简介
Apache Shiro 是一个安全框架.说白了,就是进行一下 权限校验,判断下这个用户是否登录了,是否有权限去做这件事情. Shiro 可以帮助我们完成:认证.授权.加密.会话管理.与web 集成. ...
- MVC4学习笔记之--身份认证过滤器
过滤器作为MVC模式中面向切面编程应用很广泛,例如身份验证,日志,异常,行为截取等.博客园里面的大神对应过滤器的介绍以及很多,MVC4中不同的过滤器也介绍得很清楚.FlyDragon 辉太 禁止吸烟 ...
- Shiro进行简单的身份验证(二)
一个Realm数据源: shiro.ini: [users] wp=123456 main方法执行认证: package com.wp.shiro; import org.apache.shiro.S ...
- Shiro学习笔记六(自定义Reaml-使用数据库设置 user roles permissions)
1.工程目录 pom文件还和以前设置的一样就是添加了一个数据库驱动, <dependencies> <dependency> <groupId>junit</ ...
随机推荐
- vue-router 重定向
1.从 /a 重定向到 /b const router = new VueRouter({ routes: [ { path: '/a', redirect: '/b' } ] }) 重定向的目标也可 ...
- search-a-2d-matrix——二维矩阵找数
题目描述 Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the ...
- 51单片机 | A/D转换器实现数字电压表实例
———————————————————————————————————————————— ADC0809 - - - - - - - - - - - - - - - - - - - - - - - - ...
- 网页抓取工具Teleport Ultra简介及如何使用
Teleport Ultra是一款专业的离线浏览器,能够快速.准确地从网络抓取数据并保存到本地,实现离线浏览的目的.它可以从Internet的任何地方抓回你想要的任何文件,它可以在你指定的时间自动登录 ...
- Git合并分支命令参数详解:git merge --ff
今天研究了一下git merge命令常用参数,并分别用简单的例子实验了一下,整理如下: 输入命令git merge -h可以查看相关参数: --ff 快速合并,这个是默认的参数.如果合并过程出现冲突 ...
- MATLAB squeeze 函数
squeeze 除去size为1的维度 B = squeeze(A) 描述: B = squeeze(A),B与A有相同的元素,但所有只有一行或一列的维度(a singleton dimension ...
- tomcat 使用log4j进行日志切割
因为tomcat catalina.out日志不会自己主动切割, 一.日志切割所需包在附近中 1. 压缩包中有三个jar包: log4j-1.2.16.jar tomcat-juli ...
- css 控制文本显示两行 超过省略号显示
display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; word-break: break-all; ov ...
- 《HTML 5网页开发实例具体解释》样章、内容简单介绍、前言
http://spu.jd.com/1167757597.html http://product.dangdang.com/23484942.html 样章 http://download.csdn. ...
- 简洁方便的集合处理——Java 8 stream流
背景 java 8已经发行好几年了,前段时间java 12也已经问世,但平时的工作中,很多项目的环境还停留在java1.7中.而且java8的很多新特性都是革命性的,比如各种集合的优化.lambda表 ...