shiro的使用详解~

在家无聊复习一下shiro

打开了之前的项目,由于lombok插件安装不了,不知道idea抽什么风所以get,set方法报错了,将就一下

只看shiro的使用,配置在shiro分类中有

登录方法

package com.zys.sys.controller;

import com.zys.sys.common.ActiverUser;
import com.zys.sys.common.ResultObj;
import com.zys.sys.common.WebUtils;
import com.zys.sys.domain.Loginfo;
import com.zys.sys.service.LoginfoService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

@RestController
@RequestMapping("login")
public class LoginController {

    @Autowired
    LoginfoService loginfoService;

    @RequestMapping("login")
    public ResultObj login(String loginname, String pwd){
//创建Subject对象 Subject subject
= SecurityUtils.getSubject();
//先把账号密码传入Shiro里面的UsernamePasswordToken对象里面。 AuthenticationToken token
= new UsernamePasswordToken(loginname,pwd);
try{
   //调用安全管理器,安全管理器调用自定义Realm 此时先执行i定义realm subject.login(token);
//登陆成功后就可以通过安全管理器获得用户对象。 ActiverUser activerUser
=(ActiverUser) subject.getPrincipal(); System.out.println(activerUser.toString()); WebUtils.getSession().setAttribute("user",activerUser.getUser()); //记录登录日志,插入登录表 System.out.println(WebUtils.getRequest().getRemoteAddr()); Loginfo loginfo = new Loginfo(); loginfo.setLoginname(activerUser.getUser().getName()+"-"+activerUser.getUser().getLoginname()); loginfo.setLoginip(WebUtils.getRequest().getRemoteAddr()); loginfo.setLogintime(new Date()); this.loginfoService.save(loginfo); return ResultObj.LOGIN_SUCCESS; }catch (AuthenticationException e){ return ResultObj.LOGIN_ERROR; } } }

自定义realm

package com.zys.sys.UserRealm;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zys.sys.common.ActiverUser;
import com.zys.sys.domain.User;
import com.zys.sys.service.UserService;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;

public class UserRealm extends AuthorizingRealm {


    @Autowired
    @Lazy
    UserService userService;

    @Override
    public String getName() {
        return this.getClass().getName();
    }

    @Override
    //认证方法
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

        return null;
    }

    @Override
    //授权方法
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        QueryWrapper<User> querywapper = new QueryWrapper<>();
        System.out.println(token.getCredentials()+"mmmmmmmmmmmmmmmmmmmmmmmmmmmm");
        System.out.println(token.getPrincipal()+"mmmmmmmmmmmmmmmmmmmmmmmmmmmm");
        querywapper.eq("loginname",token.getPrincipal().toString());
        User user = userService.getOne(querywapper);
        if(null != user){
            ActiverUser auser = new ActiverUser();
            auser.setUser(user);
            ByteSource bs = ByteSource.Util.bytes(user.getSalt());
//            System.out.println(bs+"----------------------------------");
            SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(auser,user.getPwd(),bs,this.getName());
            return info;
        }
        return null;
    }
}

1.doGetAuthorizationInfo方法
    该方法主要是用于当前登录用户授权(作者小白插一句:我实现该方法时只是进行了当前登录用户的角色与权限初始化,至于授权判断估计shiro帮我们做了)

    1.调用SecurityUtils.getSubject().isPermitted(String str)方法时会调用doGetAuthorizationInfo方法,SecurityUtils.getSubject().isPermitted(String str)方法返回的是boolean值所以开发者得自定义业务逻辑。

    2.在配置文件中配置有类似/**=roles["user"]或者/**=perms[“user”](/**路径是开发者自行定义)的配置的时候会调用doGetAuthorizationInfo方法,这个时候有两种情况:

       一、 当当前没有用户登录时shiro会帮我们跳转到login.jsp(默认会找根目录下的login.jsp)

       二、当前有登录用户时shiro会自动判定当前登录用户的角色或者权限符合访问当前访问路径,如果不符合那么将跳转到开  

            发者所配置的未授权提示页面( <property name="unauthorizedUrl" value="/unauthorized.jsp"/>),这种调用情

            下doGetAuthorizationInfo方法只会被调用一次,除非更换了当前登录用户。

2.doGetAuthenticationInfo方法
    该方法是进行用户验证的
    1.调用currUser.login(token)方法时会调用doGetAuthenticationInfo方法,作者小白重写该方法的主要内容是根据提交的用户名与密码到数据库进行匹配,如果匹配到了就返回一个AuthenticationInfo对象否则返回null,同样shiro会帮我们进行判断当返回null的时候会抛出一个异常,开发者可根据该异常进行相应的逻辑处理

原文地址:https://www.cnblogs.com/xiaozhang666/p/12257110.html