ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

shiro的过滤,授权,认证

2022-03-20 18:04:58  阅读:155  来源: 互联网

标签:new 认证 过滤 user org apache import shiro


具体内容在代码注释中已写
ShiroConfig

package com.Google.config;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

@Configuration
public class ShiroConfig {
    //通过@Qualifier()将这几个方法连接起来 其中的参数默认为方法名

    //ShiroFilterFactoryBean
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager getDefaultWebSecurityManager){
        ShiroFilterFactoryBean shiroBean = new ShiroFilterFactoryBean();
        //设置安全管理器
        shiroBean.setSecurityManager(getDefaultWebSecurityManager);
        //1. 实现登录拦截
        //添加shiro的内置过滤器
        /*
        * anon:无需认证就可以访问
        * authc :必须认证了才可以访问
        * user: 必须拥有 记住我 功能才能用
        * perms:拥有对某个资源权限才能访问
        * role:拥有某个角色权限才能访问
        *
        * */

        //拦截
        Map<String, String> filterMap = new HashMap<>();

        filterMap.put("/user/add","perms[add]");
        filterMap.put("/user/update","perms[update]"); //prems中的参数随便给没有要求
        filterMap.put("/user/*","authc");  //前一个参数为请求地址,(认证需要放到权限的后面,否则有些需要权限访问的页面可以直接访问)
        shiroBean.setFilterChainDefinitionMap(filterMap);

        //设置登录请求
        shiroBean.setLoginUrl("/toLogin");
        //设置无权限页面
        shiroBean.setUnauthorizedUrl("/unauthorized");


        return shiroBean;
    }

    //DefaultWebSecurityManager
    @Bean(name = "securityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //设置安全数据库
        securityManager.setRealm(userRealm);
        return securityManager;
    }
    //创建realm对象
    @Bean
    public UserRealm userRealm(){
        return new UserRealm();
    }



}

UserRealm(这个是数据层,需要我们自己配,主要执行认证和授权)

package com.Google.config;

import com.Google.pojo.userPojo;
import com.Google.service.UserServiceImpl;
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.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;

public class UserRealm extends AuthorizingRealm {
    @Autowired
    UserServiceImpl userService;


    @Override
    //授权
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("执行了授权");
        SimpleAuthorizationInfo Info = new SimpleAuthorizationInfo();

//        Info.addStringPermission("add"); //给用户添加权限(这个是所有用户都会被赋予)


        Subject subject = SecurityUtils.getSubject();//获取当前用户
        userPojo currentUser = (userPojo)subject.getPrincipal();//获取当前用户的信息

        Info.addStringPermission(currentUser.getPerms());

        return Info;
    }

    @Override
    //认证
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

        System.out.println("执行了认证");
        //用户名,密码
        UsernamePasswordToken userToken = (UsernamePasswordToken) token;
        userPojo user = userService.getUserByName(userToken.getUsername()); //获取用户
        if(user==null){ //如果没有查询到用户,就报错
            return null;//null的意思就是抛出一个异常 UnknownAccountException (很牛逼)
        }
        //密码认证。shiro做。shiro不放心让我们做,所以就帮我们做了 new SimpleAuthenticationInfo
        return new SimpleAuthenticationInfo(user,user.getPwd(),""); //将principal项赋予user,可以使授权获得当前用户信息
    }
}

标签:new,认证,过滤,user,org,apache,import,shiro
来源: https://www.cnblogs.com/luoking/p/16030763.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有