首页 > 其他分享 >Springboot之Shiro权限管理

Springboot之Shiro权限管理

时间:2022-10-31 15:00:42浏览次数:45  
标签:Springboot authc shiro org apache import 权限 Shiro user


文章目录

  • ​​Springboot之Shiro权限管理 介绍​​
  • ​​1.shiro有三个核心api(接口)​​
  • ​​2.如何使用:​​
  • ​​第一步导入shiro与springboot整合依赖​​
  • ​​第二步配置shiro类​​
  • ​​第三步自定义一个Realm类(授权和认证的作用)​​

Springboot之Shiro权限管理 介绍

当用户前台登录发起请求时:
1.从shiro中获取subject主体
SecurityUtils.getSubject();

2.判断当前用户是否认证过了,如果认证过了就放行了
subject.isAuthenticated()

3.如果没有认证过,就把前台传递的账号密码封装为一个UserNamePasswordToken对象,
new UsernamePasswordToken(username, password);

4.把UserNamePasswordToken对象传入,进行登录操作
subject.login(usernamepasswordtoken);

5.我们配置的安全管理器中实现了doGetAuthenticationInfo方法,从数据库查询用户数据,加密加盐后进行shiro的认证

6.如果认证成功,进行权限赋于。

7.根据配置shiro的真实过滤器跳转至登录成功页面或登录失败的页面。

1.shiro有三个核心api(接口)

Subject:用户主体(就是把操作权交给 SecurityManager)

SecurityManage:安全管理器(关联Realm)

Realm:Shiro 链接数据的桥梁

2.如何使用:

第一步导入shiro与springboot整合依赖

<!-- shiro与spring整合依赖 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.0</version>
</dependency>

第二步配置shiro类

package com.itheima.shiro;

import java.util.LinkedHashMap;
import java.util.Map;

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 at.pollux.thymeleaf.shiro.dialect.ShiroDialect;

/**
* Shiro的配置类
* @author lenovo
*
*/
@Configuration
public class ShiroConfig {

/**
* 创建ShiroFilterFactoryBean
*/
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManager securityManager){

ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();第一步创建过滤器对象

//设置安全管理器放入核心api(securityManager)
shiroFilterFactoryBean.setSecurityManager(securityManager);

//添加Shiro内置过滤器
/**
* Shiro内置过滤器,可以实现权限相关的拦截器
* 常用的过滤器:
* anon: 无需认证(登录)可以访问
* authc: 必须认证才可以访问
* user: 如果使用rememberMe的功能可以直接访问
* perms: 该资源必须得到资源权限才可以访问
* role: 该资源必须得到角色权限才可以访问
*/
Map<String,String> filterMap = new LinkedHashMap<String,String>();
/*filterMap.put("/add", "authc");
filterMap.put("/update", "authc");*/

filterMap.put("/testThymeleaf", "anon");
//放行login.html页面
filterMap.put("/login", "anon");

//授权过滤器
//注意:当前授权拦截后,shiro会自动跳转到未授权页面
filterMap.put("/add", "perms[user:add]");
filterMap.put("/update", "perms[user:update]");

filterMap.put("/*", "authc");

//修改调整的登录页面
shiroFilterFactoryBean.setLoginUrl("/toLogin");
//设置未授权提示页面
shiroFilterFactoryBean.setUnauthorizedUrl("/noAuth");

shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);


return shiroFilterFactoryBean;
}

/**
* 创建DefaultWebSecurityManager
* 安全处理器SecurityManage:安全管理器(关联Realm)
*/
@Bean(name="securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm")UserRealm userRealm){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//关联realm
securityManager.setRealm(userRealm);
return securityManager;
}

/**
* 创建Realm
*/
@Bean(name="userRealm")
public UserRealm getRealm(){
return new UserRealm();
}

/**
* 配置ShiroDialect,用于thymeleaf和shiro标签配合使用
*/
@Bean
public ShiroDialect getShiroDialect(){
return new ShiroDialect();
}
}

第三步自定义一个Realm类(授权和认证的作用)

授权:根据不同角色的方式进行授予不同的权利

认证:验证账户名等是否正确

package com.itheima.shiro;

import org.apache.shiro.SecurityUtils;
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.authc.UsernamePasswordToken;
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;

import com.itheima.domain.User;
import com.itheima.service.UserService;

/**
* 自定义Realm
* @author lenovo
*
*/
public class UserRealm extends AuthorizingRealm{

/**
* 执行授权逻辑
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
System.out.println("执行授权逻辑");

//给资源进行授权
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();

//添加资源的授权字符串
//info.addStringPermission("user:add");

//到数据库查询当前登录用户的授权字符串
//获取当前登录用户
Subject subject = SecurityUtils.getSubject();
User user = (User)subject.getPrincipal();
User dbUser = userSerivce.findById(user.getId());

info.addStringPermission(dbUser.getPerms());

return info;
}

@Autowired
private UserService userSerivce;

/**
* 执行认证逻辑
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException {
System.out.println("执行认证逻辑");

//编写shiro判断逻辑,判断用户名和密码
//1.判断用户名
UsernamePasswordToken token = (UsernamePasswordToken)arg0;

User user = userSerivce.findByName(token.getUsername());

if(user==null){
//用户名不存在
return null;//shiro底层会抛出UnKnowAccountException
}

//2.判断密码
return new SimpleAuthenticationInfo(user,user.getPassword(),"");
}

}


标签:Springboot,authc,shiro,org,apache,import,权限,Shiro,user
From: https://blog.51cto.com/u_15854304/5809778

相关文章