欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Springboot shiro认证授权实现原理及实例

程序员文章站 2022-06-12 11:56:11
关于认证授权,需要的数据表有:用户表,角色表,用户角色关联表,权限表,角色权限关联表,一次如下之前写过了shiro的登录认证,在自定义的realm中,我们实现authorizingrealm接口中的方...

关于认证授权,需要的数据表有:用户表,角色表,用户角色关联表,权限表,角色权限关联表,一次如下

Springboot shiro认证授权实现原理及实例Springboot shiro认证授权实现原理及实例Springboot shiro认证授权实现原理及实例

Springboot shiro认证授权实现原理及实例Springboot shiro认证授权实现原理及实例

之前写过了shiro的登录认证,在自定义的realm中,我们实现authorizingrealm接口中的方法:package com.zs.springboot.realm;

import com.zs.springboot.model.user;
import com.zs.springboot.service.userservice;
import com.zs.springboot.util.resultutil;
import org.apache.shiro.securityutils;
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.session.session;
import org.apache.shiro.subject.principalcollection;
import org.apache.shiro.util.bytesource;
import org.springframework.beans.factory.annotation.autowired;

import java.util.list;
import java.util.map;

/**
 * @author zs
 * 登录realm
 */
public class loginrealm extends authorizingrealm {

  @autowired
  private userservice userservice;
  /**
   * 授权方法,只有页面出现关于权限标签的时候或者项目中关于授权注解的时候,才可以被使用
   * @param principal
   * @return
   */
  @override
  protected authorizationinfo dogetauthorizationinfo(principalcollection principal) { 
    user user = (user) principal.getprimaryprincipal();
    map<string, object> resultmap1 = userservice.getrolebyuid(user.getuid());
    //获取角色,通过多表查询获取用户对应的角色
    list<string> rolelist = (list<string>) resultutil.getresult(resultmap1);
    simpleauthorizationinfo info = new simpleauthorizationinfo();
    info.addroles(rolelist);
    //获取权限,通过关联中间表,多表查询出该用户对应的角色所拥有的权限
    map<string, object> resultmap2 = userservice.getpromessionbyuid(user.getuid());
    list<string> permissionlist = (list<string>) resultutil.getresult(resultmap2);
    info.addstringpermissions(permissionlist);
    return info;
  }

  /**
   * 认证方法
   * @param token
   * @return
   * @throws authenticationexception
   */
  @override
  protected authenticationinfo dogetauthenticationinfo(authenticationtoken token) throws authenticationexception {
    //获取当前登录的用户名
    string username = (string) token.getprincipal();
    //根据用户到数据库搜索用户信息
    map<string, object> login = userservice.login(username);
    //如果用户不存在则抛出异常
    if ((integer) login.get("code") == 404) {
      throw new unknownaccountexception("用户不存在");
    }
    //如果用户存在,获取用户信息
    user user = (user) login.get("result");
    //进行认证
    simpleauthenticationinfo info = new simpleauthenticationinfo(user, user.getpassword(), bytesource.util.bytes(user.getsalt()), this.getname());
    //将用户信息放入session中,密码制空
    session session = securityutils.getsubject().getsession();
    user.setpassword(null);
    session.setattribute("user", user);
    return info;
  }
}

注意,在授权方法中,principal.getprimaryprincipal()方法;如果在认证方法中,simpleauthenticationinfo对象中传递的第一个参数如果为obj对象,则返回值为对象(可以强转为user对象),如果传递的时username字符串,则返回的是username字符串,字符串是不能强转为user对象的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。