Spring 整合Shiro鉴权授权

一、什么是Shiro

shiro是apache的一个开源框架,是一个权限管理的框架,实现 用户认证、用户授权。spring中有spring security ,是一个权限框架,它和spring依赖过于紧密,没有shiro使用简单。 shiro不依赖于spring,shiro不仅可以实现 web应用的权限管理,还可以实现c/s系统,分布式系统权限管理,shiro属于轻量框架,越来越多企业项目开始使用shiro,shiro就是一个安全认证框架

应用场景:

在独立应用中使用

在web中使用

在spring框架中集成。

shiro 解决应用安全的四要素:

认证 - 用户身份识别,常被称为用户“登录”

授权 - 访问控制

密码加密 - 保护或隐藏数据防止被偷窥

会话管理 - 与用户相关的时间敏感的数据

三个核心组件:Subject, SecurityManager 和 Realms.

Subject:即“当前操作用户”。但是,在Shiro中,Subject这一概念并不仅仅指人,也可以是第三方进程、后台帐户(Daemon Account)或其他类似事物。它仅仅意味着“当前跟软件交互的东西”。

SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务。

Realm: Realm充当了Shiro与应用安全数据间的“桥梁”或者“连接器”。也就是说,当对用户执行认证(登录)和授权(访问控制)验证时,Shiro会从应用配置的Realm中查找用户及其权限信息。

 Subject代表了当前用户的安全操作,SecurityManager则管理所有用户的安全操作,Realm实质上是一个安全相关的dao

二、shiro与Java的简单整合

1.创建一个继承了AuthorizingRealm类的子类myrealm
package com.apesource.shiro;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;


public class MyRealm extends AuthorizingRealm {


    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
   
    }
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken)  {
      
    }
}

如上继承后需要重写两个方法 doGetAuthenticationInfo 和 doGetAuthorizationInfo

doGetAuthenticationInfo

主要是用来进行鉴权的,参数authenticationToken登录构造的usernamepasswordtoken

doGetAuthorizationInfo

主要是用来做授权的,参数principalCollection:包含了所有已认证的安全数据

返回值:AuthorizationInfoInfo:授权数据

注:鉴权与授权是同时进行的,先进行鉴权再进行授权

2.将账号和密码存入Token中,并调用subject进行鉴权
@RequestMapping(value="/login")
    public String login(User user) {

        try {
            //1.构造登录令牌
            UsernamePasswordToken upToken = new UsernamePasswordToken(user.getUsername(),user.getPassword());
            //2.获取subject
            Subject subject = SecurityUtils.getSubject();
            //3.调用subject进行登录
            subject.login(upToken);
            return "登录成功";

        }catch (Exception e) {
            return "用户名或密码错误";
        }
    }
3.在要进行鉴权的控制器上增加注解@RequiresPermissions
  @RequiresPermissions("user-home")
    @RequestMapping(value = "/user/home")
    public String home() {
        return "访问个人主页成功";
    }

以上就是shiro在java中的应用

你可能感兴趣的:(spring,boot,后端,java)