博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shiro入门示例
阅读量:6853 次
发布时间:2019-06-26

本文共 5272 字,大约阅读时间需要 17 分钟。

一、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
,如需转载请自行联系原作者
你可能感兴趣的文章
Powershell环境变量
查看>>
ruby 集合
查看>>
harbor进程组件化运行及systemd 进程日志分写
查看>>
Web自动化测试中使用groovy实现页面的对象化
查看>>
RHEL5基于RSA的公匙和私匙加密认证SSH应用于服务器远程备份
查看>>
让你成功安装vscode中go的相关插件
查看>>
Java仿雷电及其源代码
查看>>
linux关机命令
查看>>
Visual studio Express 2012 for Web 试用
查看>>
ruby初级语法知识
查看>>
CA证书服务器(1) 数据加密技术
查看>>
Qt学习之路(23): 自定义事件
查看>>
如何让Windows 2003更加安全
查看>>
烂泥:使用Navicat for SQL Server新建数据库、用户及权限赋予
查看>>
采用hadoop对日志进行分布式分析框架
查看>>
服务器监控和虚拟机管理之六PRO的配置与实现
查看>>
【转】烂泥:查看MySql版本号命令
查看>>
MFC绘制直方图和饼图
查看>>
tf.minimize
查看>>
自己动手编写 IronPython IDE
查看>>