shiro学习(一)
基础依赖:
shiro-core,junit(因为在单元测试中)


test.class
public class AuthenticationTest {
SimpleAccountRealm realm = new SimpleAccountRealm();
@Before
public void addUser(){
realm.addAccount("mark","123456");
}
@Test
public void testAuthentication(){
//1.构建securityManager环境
DefaultSecurityManager securityManager = new DefaultSecurityManager();
securityManager.setRealm(realm);
//2.主体提交认证请求
SecurityUtils.setSecurityManager(securityManager);
Subject subject = SecurityUtils.getSubject();
//获取主体之后,就提交认证
UsernamePasswordToken token = new UsernamePasswordToken("mark","123456");
//退出认证
subject.login(token);
System.out.println("是否认证成功isAuthenticated:" + subject.isAuthenticated());
//退出
subject.logout();
System.out.println("是否认证成功isAuthenticated:" + subject.isAuthenticated());
} }
//控制台
是否认证成功isAuthenticated:true
//如果用户名不正确,报
org.apache.shiro.authc.UnknownAccountException: Realm
//如果密码不正确,报
org.apache.shiro.authc.IncorrectCredentialsException: Submitted credentials for token

授权检测 subject.checkRole("father");
SimpleAccountRealm realm = new SimpleAccountRealm();
@Before
public void addUser(){
realm.addAccount("mark","123456","father");
}
@Test
public void testAuthentication(){
//1.构建securityManager环境
DefaultSecurityManager securityManager = new DefaultSecurityManager();
securityManager.setRealm(realm);
//2.主体提交认证请求
SecurityUtils.setSecurityManager(securityManager);
Subject subject = SecurityUtils.getSubject();
//获取主体之后,就提交认证
UsernamePasswordToken token = new UsernamePasswordToken("mark","123456");
subject.login(token);
//打印认证是否成功
System.out.println("是否认证成功isAuthenticated:" + subject.isAuthenticated());
//授权
subject.checkRole("father");
//退出
subject.logout();
System.out.println("是否认证成功isAuthenticated:" + subject.isAuthenticated()); }
}
如果授权角色改为mother ,则报错 org.apache.shiro.authz.UnauthorizedException: Subject does not have role [mother]

自定义IniRealm
public class IniRealmTest {
IniRealm iniRealm=new IniRealm("classpath:user.ini");
@Test
public void testIniRealm(){
DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
defaultSecurityManager.setRealm(iniRealm);
SecurityUtils.setSecurityManager(defaultSecurityManager);
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("admin", "admin");
subject.login(token);
System.out.println("自定义认证:"+subject.isAuthenticated());
//subject.logout();
//验证权限名字
subject.checkRole("admin");
//验证,权限名是否拥有该权限
subject.checkPermission("user:delete");
//验证,权限名是否拥有多种相应权限
subject.checkPermissions("user:delete","user:update");
}
}
user.ini配置文件
其位置:

[users]
#用户名,密码,权限名字
admin=admin,admin
[roles]
#权限名=(拥有)删除用户的权限
admin=user:delete,user:update
JdbcRealm
首先要添加:mysql、druid依赖
代码:
public class JdbcRealmTest {
/*
JdbcRealm需要访问数据
*/
DruidDataSource dataSource=new DruidDataSource();
{
dataSource.setUrl("jdbc:mysql://localhost:3306/shiro_test");
dataSource.setUsername("root");
dataSource.setPassword("");
}
@Test
public void testJdbcRealm(){
JdbcRealm jdbcRealm=new JdbcRealm();
jdbcRealm.setDataSource(dataSource);
//1.构建securityManager环境
DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
defaultSecurityManager.setRealm(jdbcRealm);
SecurityUtils.setSecurityManager(defaultSecurityManager);
//2.获取主体 进行认证
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("admin","admin");
subject.login(token);
subject.isAuthenticated();
}
}
数据库shiro-test,表users

SQL语句,在JdbcRealm.class默认写好

深入,查询用户拥有的角色以及该角色拥有的权限
public class JdbcRealmTest {
/*
JdbcRealm需要访问数据
*/
DruidDataSource dataSource=new DruidDataSource();
{
dataSource.setUrl("jdbc:mysql://localhost:3306/shiro_test?useUnicode=true&characterEncoding=utf-8&useSSL=false");
dataSource.setUsername("root");
dataSource.setPassword("");
}
@Test
public void testJdbcRealm(){
JdbcRealm jdbcRealm=new JdbcRealm();
jdbcRealm.setDataSource(dataSource);
//jdbc设置权限开关
jdbcRealm.setPermissionsLookupEnabled(true);
//1.构建securityManager环境
DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
defaultSecurityManager.setRealm(jdbcRealm);
SecurityUtils.setSecurityManager(defaultSecurityManager);
//2.获取主体 进行认证
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("admin","admin");
subject.login(token);
subject.isAuthenticated();
subject.checkRole("admin");
subject.checkRoles("admin","user");
subject.checkPermission("user:select");
}
}
注意:查询的表需要sql语句的表一致,不然报错


注意查询权限数据需jdbcrealm需开启权限开关
代码: jdbcRealm.setPermissionsLookupEnabled(true);
哈哈哈,如果表名不一致,当然也可以啊,那就要手写SQL语句(也不难,抄袭而已)
SQL语句:
//认证
String sql_pwd="select password from test_user where username= ?";
jdbcRealm.setAuthenticationQuery(sql_pwd);
//认证 角色
String sql_role="select role_name from test_user_roles where username=?";
jdbcRealm.setUserRolesQuery(sql_role);
//认证 权限
String sql_per="select permission from test_roles_permissions where role_name=?";
jdbcRealm.setPermissionsQuery(sql_per);
测试类
public class JdbcRealmSQL {
//连接数据库
DruidDataSource dataSource=new DruidDataSource();
{
dataSource.setUrl("jdbc:mysql://localhost:3306/shiro_test?useUnicode=true&characterEncoding=utf-8&useSSL=false");
dataSource.setUsername("root");
dataSource.setPassword("");
}
@Test
public void testSql(){
//自定义JdbcRealm
JdbcRealm jdbcRealm = new JdbcRealm();
jdbcRealm.setDataSource(dataSource);
//开启权限设置开关
jdbcRealm.setPermissionsLookupEnabled(true);
/*
下面是自定义sql语句,查询的是以test_开头的表
模板语句
"select password from users where username = ?";
"select password, password_salt from users where username = ?";
"select role_name from user_roles where username = ?";
"select permission from roles_permissions where role_name = ?";
*/
//认证
String sql_pwd="select password from test_user where username= ?";
jdbcRealm.setAuthenticationQuery(sql_pwd);
//认证 角色
String sql_role="select role_name from test_user_roles where username=?";
jdbcRealm.setUserRolesQuery(sql_role);
//认证 权限
String sql_per="select permission from test_roles_permissions where role_name=?";
jdbcRealm.setPermissionsQuery(sql_per);
DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
defaultSecurityManager.setRealm(jdbcRealm);
SecurityUtils.setSecurityManager(defaultSecurityManager);
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("xiaoming","123456");
//认证 登录
subject.login(token);
//认证 角色
subject.checkRole("admin");
subject.checkRoles("admin","user");
//认证 权限
subject.checkPermission("user:delete");
}
}
表

shiro学习(一)的更多相关文章
- Shiro学习笔记(5)——web集成
Web集成 shiro配置文件shiroini 界面 webxml最关键 Servlet 測试 基于 Basic 的拦截器身份验证 Web集成 大多数情况.web项目都会集成spring.shiro在 ...
- Shiro学习
Shiro学习资源 Shiro官网,http://shiro.apache.org/index.html 学习网站链接,http://blog.java1234.com/blog/articles/4 ...
- Apache Shiro学习-2-Apache Shiro Web Support
Apache Shiro Web Support 1. 配置 将 Shiro 整合到 Web 应用中的最简单方式是在 web.xml 的 Servlet ContextListener 和 Fil ...
- shiro学习笔记_0600_自定义realm实现授权
博客shiro学习笔记_0400_自定义Realm实现身份认证 介绍了认证,这里介绍授权. 1,仅仅通过配置文件来指定权限不够灵活且不方便.在实际的应用中大多数情况下都是将用户信息,角色信息,权限信息 ...
- Apache shiro学习总结
Apache shiro集群实现 (一) shiro入门介绍 Apache shiro集群实现 (二) shiro 的INI配置 Apache shiro集群实现 (三)shiro身份认证(Shiro ...
- Shiro学习笔记总结,附加" 身份认证 "源码案例(一)
Shiro学习笔记总结 内容介绍: 一.Shiro介绍 二.subject认证主体 三.身份认证流程 四.Realm & JDBC reaml介绍 五.Shiro.ini配置介绍 六.源码案例 ...
- SpringBoot+Shiro学习(七):Filter过滤器管理
SpringBoot+Shiro学习(七):Filter过滤器管理 Hiwayz 关注 0.5 2018.09.06 19:09* 字数 1070 阅读 5922评论 1喜欢 20 先从我们写的一个 ...
- Apache Shiro 学习记录5
本来这篇文章是想写从Factory加载ini配置到生成securityManager的过程的....但是貌似涉及的东西有点多...我学的又比较慢...很多类都来不及研究,我又怕等我后面的研究了前面的都 ...
- Apache Shiro 学习记录4
今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...
- Apache Shiro 学习记录1
最近几天在学习Apache Shiro......看了一些大神们的教程.....感觉收获不少.....但是毕竟教程也只是指引一下方向....即使是精品教程,仍然有很多东西都没有说明....所以自己也稍 ...
随机推荐
- mac 配置apache
Apache配置 对httpd.conf文件的配置.首先打开 /etc/apache2/httpd.conf文件,也就是Apache2.4的相关配置文件. 连接php 首先我们将相应的PHP版本配置进 ...
- Rocketmq异步发送消息
package com.bfxy.rocketmq.quickstart; import java.util.List; import org.apache.rocketmq.client.excep ...
- <JavaScript>如何阅读《JavaScript高级程序设计》(一)
题外话 最近在看<JavaScript高级程序设计>这本书,面对着700多页的厚书籍,心里有点压力,所以我决定梳理一下..探究一下到底怎么读这本书.本书的内容好像只有到ES5...所以只能 ...
- 001-软件架构概览、maven补充【分包工程、合并包、web容器插件】、git补充
一.整体概述 1.1.共性问题 技术瓶颈.不成体系.不能实际使用.不能落地.无法入门 1.2.目标-软件架构 专注于构建:高可扩展.高性能.大数据量.高并发.分布式的系统架构. 各项技术.组合构建分布 ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_5-04 feign结合hystrix断路器开发实战下
笔记 4.Feign结合Hystrix断路器开发实战<下> 简介:讲解SpringCloud整合断路器的使用,用户服务异常情况 1.feign结合Hystrix ...
- mongodb全文搜索
mongodb 的 enterprise 集合存储企业信息: { "_id" : ObjectId("5d62b2a4380d051cfc00565b"), & ...
- Linux新增开放端口
CentOS系统 开放端口的方法: 方法一:命令行方式 1. 开放端口命令: /sbin/iptables -I INPUT -p tcp --dport 8080 -j ...
- web页面找不到资源文件,报404,但是资源文件存在且路径没错
如题 , 今天遇到这个问题,maven项目导入本地myeclipse,正常跑起来之后,在web端存在部分页面资源加载不进来. 但是项目资源确实存在,一开始以为是myeclipse开发环境搭建错误导致, ...
- 9-2 yum,dnf和apt
yum, CentOS: yum, dnf YUM: Yellowdog Update Modifier,rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具 ...
- PJzhang:python基础进阶的10个疗程-two
猫宁!!! 第2节:python基本图形绘制 保留字是python基础语法的支撑 默写python代码是件挺恐怖的事情!!! 2008年android操作系统诞生 计算时代 编程语言也是一个江湖 C语 ...