Shiro简单入门

1:关键对象

subject:主体,理解为用户,可能是程序,都要去访问系统的资源,系统需要对subject进行身份的认证.

principal:身份信息,通常是唯一的,一个主体有多个身份信息,但是都有一个主的身份信息(primary principal)

credential:凭证信息,可以是密码,证书,指纹。。。。

总结:主体进行身份认证时需要提供身份信息和凭证 信息

2:授权流程

授权流程可以理解为: who 对what(which)资源进行how(怎样的) 操作

who: 主体 即subject, subject在认证通过后系统进行访问控制

what(which):资源(Resource),subject必须具备资源的访问权限才可以访问该资源.

how:权限/许可(permission)subject对该资源有怎样的权限:如增加?删除?修改?

3:权限模型

 最终演变成:(权限其实是针对于资源来说的)

4:控制权限

4-1基于角色的访问

RBAC(role based access control)

缺点:这种方式不利于系统维护(可扩展不强)

4-2基于资源的访问  (建议使用这种)

RBAC(resource based access control)

5:粗粒度和细粒度权限

5-1概念

粗粒度权限管理:(页面的访问信息,仅仅能进页面,不能进行增删改查操作)对资源类型进行管理 比如:菜单, url连接, 用户添加页面, 类方法

细粒度的权限管理:(数据级别的权限管理:如某个模块的增删改查) 对资源实例的权限管理 比如:资源类型的具体化 比如用户id为001的修改url,

5-2如何实现粗粒度和细粒度的权限控制

实现粗粒度: (一般使用框架来实现)

比如:通过springMvc的拦截器实现授权(通过截取url 和数据库中拥有的权限资源做对比 没有就不会放行)

实现细粒度:

业务层实现控制

6:权限框架实现权限控制 (主要用来实现控制粗粒度的权限控制)

 

7: 不使用框架而是基于URL拦截的方式实现

     在实际开发中比较常用的方式

8:Shiro

入门实例

package cn.shiro.authentication;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;
import org.apache.shiro.mgt.SecurityManager;
import org.junit.Test;

public class AuthenticationTest {

    @Test
    public void testLoginAndLogout() {
        //需要创建一个securityManager工厂
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-first.ini");

        //创建一个SecurityManager
        SecurityManager securityManager = factory.getInstance();

        //将securityManager设置到当前运行环境中
        SecurityUtils.setSecurityManager(securityManager);


        //获取到里面穿件的subject
        Subject subject = SecurityUtils.getSubject();
        //在认证提交前准备token(令牌)
        UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "111111");
        //执行提交
        try {
            subject.login(token);

        } catch (AuthenticationException e) {
            e.printStackTrace();
        }

        //是否验证通过
        boolean isAuthenticated = subject.isAuthenticated();
        System.out.println(isAuthenticated);

        //执行退出操作
        subject.logout();
    }
}

坚持
原文地址:https://www.cnblogs.com/gaoSJ/p/12802660.html