现在才发现原来安全其实是比较有趣的一个话题。  由于之前已经练过了spring-security的相关内容。所以这里的shiro只是作为一个知识补充,用作对比学习理解。   由于这个框架相较而言内容比较多一点,所以希望学习的相对详细一点。  想了想,大概从这几个方面去学习它:  1.shiro有什么作用;   2.shiro的来源与发展;   3.shiro的使用; 4.核心概念与理解。

1.shiro有什么用?

shiro安全框架学习笔记_web环境

2.shiro的来源与发展:

shiro安全框架学习笔记_apache_02

shiro安全框架学习笔记_apache_03

shiro安全框架学习笔记_apache_04

3.Shiro的使用:

     官方文档的内容,我有点迷。 

     但是就我理解的话,我会根据上下文环境划分为两类:  普通java环境;    java web环境。 官网给出的是普通的java环境。  

      

package com.automannn;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;


/**
* @author automannn@163.com
* @time 2018/11/25 20:16
*/
public class Main {
public static void main(String[] args) {
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();

SecurityUtils.setSecurityManager(securityManager);
Subject currentUser = SecurityUtils.getSubject();
Session session = currentUser.getSession();
session.setAttribute("key","hello,shiro!");


if (!currentUser.isAuthenticated()){
UsernamePasswordToken token = new UsernamePasswordToken("automannn","automannn");
token.setRememberMe(true);
try {
currentUser.login(token);
}catch (UnknownAccountException e){
System.out.println("用户名不存在!");
}
}
}
}
[main]
cm = org.apache.shiro.authc.credential.HashedCredentialsMatcher
#cm.hashAlgorithm = SHA-256
cm.hashIterations = 1024
# Base64 encoding (less text):
cm.storedCredentialsHexEncoded = false

iniRealm.credentialsMatcher = $cm

[users]
jdoe = TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJpcyByZWFzb2
asmith = IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbXNoZWQsIG5vdCB

  结果:

shiro安全框架学习笔记_spring_05

  注意:

           1.每个shiro环境,必须具备一个SecurityManager。 这里由ini配置提供。  

           2. 由于版本的问题,原来的这个配置已经被废弃。   改为由 Environment接口提供。 但是我在网上没有找到相关的例子。 因此还是使用了原来的类。原来的类应该是默认使用了Commons-logging日志框架实现,因此我们必须要将相关引入jcl的依赖。

           3.java web环境下,securityManager由过滤器提供实例操作。 

           4.session不是web环境特有的,为独立的应用也引入了session的概念。 

4.shiro核心概念与理解:

  shiro涉及到的核心概念有:  Subject;    SecurityManager;    Realms

  1.Subject:

shiro安全框架学习笔记_apache_06

shiro安全框架学习笔记_web环境_07

2.SecurityManager:

   就目前来看,它是shiro核心中的核心。  如果要与Spring-security做个对比的话,我觉得有点类似于: 

shiro安全框架学习笔记_spring_08

    它会根据过滤规则,挑选一个提供了该途径认证方式的方式的认证提供器来完成认证逻辑。

     简言之,它们就是整个业务逻辑 总控。  

3.Realm:

shiro安全框架学习笔记_apache_09

   类比到spring-secuirty中就是:

shiro安全框架学习笔记_spring_10

   它是spring-security与数据的交互桥梁,同时也提供权限等操作。 

    相关的配置,以及使用将在以后进行学习。

虽然有些水,但是总算没有食言。  三篇,耶~~    晚上可以继续放纵一下了哈哈哈。