shiro入门示例

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介:

一、pom引入maven依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<dependencies>
     <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version> 4.12 </version>
     </dependency>
     <!-- https: //mvnrepository.com/artifact/commons-logging/commons-logging -->
     <dependency>
         <groupId>commons-logging</groupId>
         <artifactId>commons-logging</artifactId>
         <version> 1.2 </version>
     </dependency>
     <!-- https: //mvnrepository.com/artifact/org.apache.shiro/shiro-core -->
     <dependency>
         <groupId>org.apache.shiro</groupId>
         <artifactId>shiro-core</artifactId>
         <version> 1.3 . 2 </version>
     </dependency>
</dependencies>

  

二、从ini文件获取用户名密码

shiro.ini文件
1
2
[users]
admin= 123456
 
单元测试:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Test
public  void  demoIni(){
     //init配置文件初始化SecurityManager工厂
     Factory<SecurityManager> factory= new  IniSecurityManagerFactory( "classpath:shiro.ini" );
     SecurityManager securityManager=factory.getInstance();
     SecurityUtils.setSecurityManager(securityManager);
  
     Subject subject=SecurityUtils.getSubject();
     UsernamePasswordToken token= new  UsernamePasswordToken( "admin" , "123456" );
  
     try {
         subject.login(token);
     } catch  (AuthenticationException ex){
  
     }
 
     org.junit.Assert.assertEquals( true ,subject.isAuthenticated());
  
     subject.logout();
}

 

三、自定义realm

1.自定义myRealm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public  class  myRealm1  implements  Realm {
     public  String getName() {
         return  "myRealm1" ;
     }
  
     public  boolean  supports(AuthenticationToken authenticationToken) {
         return  authenticationToken  instanceof  UsernamePasswordToken;
     }
  
     public  AuthenticationInfo getAuthenticationInfo(AuthenticationToken token)  throws  AuthenticationException {
         String username=(String)token.getPrincipal();
         String password= new  String(( char [])token.getCredentials());
  
         if (!username.equals( "admin" )){
             throw  new  UnknownAccountException();
         }
  
         if (!password.equals( "123456" )){
             throw  new  IncorrectCredentialsException();
         }
  
         return  new  SimpleAuthenticationInfo(username,password,getName());
     }
}

 

2.shiro-realm.init配置文件
1
2
3
[main]
myrealm=realms.myRealm1
securityManager.realms=$myrealm 
说明:
  • 变量名=全限定类名会自动创建一个类实例
  • 变量名.属性=值 自动调用相应的setter方法进行赋值
  • $变量名 引用之前的一个对象实例 
 
3.单元测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Test
public  void  demoCustomRealm(){
     //init配置文件初始化SecurityManager工厂
     Factory<SecurityManager> factory= new  IniSecurityManagerFactory( "classpath:shiro-realm.ini" );
     SecurityManager securityManager=factory.getInstance();
     SecurityUtils.setSecurityManager(securityManager);
  
     Subject subject=SecurityUtils.getSubject();
     UsernamePasswordToken token= new  UsernamePasswordToken( "admin" , "123456" );
  
     try {
         subject.login(token);
     } catch  (AuthenticationException ex){
  
     }
  
     org.junit.Assert.assertEquals( true ,subject.isAuthenticated());
  
     subject.logout();
}

三、jdbc realm

1.还需要引入依赖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!--jdbcrealm依赖 start-->
<!-- https: //mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
     <groupId>mysql</groupId>
     <artifactId>mysql-connector-java</artifactId>
     <version> 6.0 . 6 </version>
</dependency>
<!-- https: //mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>druid</artifactId>
     <version> 1.1 . 3 </version>
</dependency>
<!--jdbcrealm依赖 end-->

  2.sql

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
use cathycms;
  
create table users (
   id bigint auto_increment,
   username varchar( 100 ),
   password varchar( 100 ),
   password_salt varchar( 100 ),
   constraint pk_users primary key(id)
) charset=utf8 ENGINE=InnoDB;
create unique index idx_users_username on users(username);
  
create table user_roles(
   id bigint auto_increment,
   username varchar( 100 ),
   role_name varchar( 100 ),
   constraint pk_user_roles primary key(id)
) charset=utf8 ENGINE=InnoDB;
create unique index idx_user_roles on user_roles(username, role_name);
  
create table roles_permissions(
   id bigint auto_increment,
   role_name varchar( 100 ),
   permission varchar( 100 ),
   constraint pk_roles_permissions primary key(id)
) charset=utf8 ENGINE=InnoDB;
create unique index idx_roles_permissions on roles_permissions(role_name, permission);
  
insert into users(username,password)values( 'admin' , '123' );

  

3.ini配置文件
1
2
3
4
5
6
7
8
9
[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/cathycms
dataSource.username=root
dataSource.password=root
jdbcRealm.dataSource=$dataSource
securityManager.realms=$jdbcRealm

   

4.单元测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Test
public  void  demoJdbcRealm(){
     //init配置文件初始化SecurityManager工厂
     Factory<SecurityManager> factory= new  IniSecurityManagerFactory( "classpath:shiro-jdbc-realm.ini" );
     SecurityManager securityManager=factory.getInstance();
     SecurityUtils.setSecurityManager(securityManager);
  
     Subject subject=SecurityUtils.getSubject();
     UsernamePasswordToken token= new  UsernamePasswordToken( "admin" , "123" );
  
     try {
         subject.login(token);
     } catch  (AuthenticationException ex){
  
     }
  
     org.junit.Assert.assertEquals( true ,subject.isAuthenticated());
  
     subject.logout();
}

  

 
参考资料:说起shiro,最好的教程必须是张开涛老师的《跟我学shiro系列》




    本文转自 陈敬(Cathy) 博客园博客,原文链接:http://www.cnblogs.com/janes/p/7553198.html ,如需转载请自行联系原作者

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
编解码 程序员 atlas
Unity 之 图集属性详解和代码示例 -- 拓展一键自动打包图集工具
图集只是当所有给低昂的纹理需要相同的着色器时采用的一种方法,如果一些纹理需要通过着色器应用独立的图形效果,它们就必须分离到自己的材质中,并在单独的组中打图集。
2326 0
Unity 之 图集属性详解和代码示例 -- 拓展一键自动打包图集工具
离线安装htop
离线安装htop
1270 0
|
5月前
|
数据采集 监控 搜索推荐
301重定向终极指南:从基础到精通的网站改道艺术
301重定向是网站维护中的关键操作,用于将旧URL永久迁移至新地址,保障用户体验、传递SEO权重并保护链接资产。本文详解其核心概念、技术实现、SEO影响及常见陷阱,助力网站管理者高效规划URL变更策略。
242 2
|
7月前
|
传感器 人工智能 供应链
一场关于物料清单BOM的深度对话
这段对话发生在某科技公司茶水间,新入职的采购专员张薇向供应链总监陈峰请教BOM表的作用。陈峰以乐高说明书为喻,解释BOM是产品的物料清单,涵盖零件型号、用量与供应商信息。他通过实例说明BOM错误可能引发采购、生产和售后等环节的连锁问题,如材料浪费、返工增加及客户索赔。最后,陈峰提出通过源头管控、动态监测和反向追溯优化BOM管理,并强调其准确率对提升企业毛利率的重要性,展现了BOM在现代制造业中“悄然重写利润法则”的核心地位。
197 12
若依修改,修改代理线上接口登录后台,若依框架如何使用线上的接口,如何在本地获取网页上的接口
若依修改,修改代理线上接口登录后台,若依框架如何使用线上的接口,如何在本地获取网页上的接口
|
开发工具
如何在 Vim / Vi 中撤消和重做?
【4月更文挑战第19天】
911 0
如何在 Vim / Vi 中撤消和重做?
|
存储
ENVI_IDL:批量获取影像文件各个波段的中值并输出为csv文件
ENVI_IDL:批量获取影像文件各个波段的中值并输出为csv文件
609 0
|
存储 网络协议 算法
nacos源码分析-心跳检测(服务端)
前面我们讲了《nacos源码分析-服务注册(客户端)》 和 《nacos源码分析-服务注册(服务端)》,主要是讲的服务注册流程,本章节我们来讲服务心跳检测机制。
|
数据可视化 数据挖掘 BI
Excel最佳替代品!免费好用功能全,一键制作可视化报表|伙伴云
Excel最佳替代品!免费好用功能全,一键制作可视化报表|伙伴云