承接上一篇博客:https://blog.csdn.net/qq_41115379/article/details/113106449
这是下一篇博客:https://blog.csdn.net/qq_41115379/article/details/113106449
首先要说的是,这个项目实战是参考自黑马,可以去对应视频看一看:https://www.bilibili.com/video/BV1ct411x7CN
最后一篇主要的是实现shiro整合用户授权
首先在shiroConfig这边进行小小的改动
在filterMap这边加入这个
filterMap.put("/add","perms[user:add]");
这边需要先用正确的账号密码登录
也就是未授权的错误
然后继续修改
shiroConfig
package com.example.shiro;
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.LinkedHashMap;
import java.util.Map;
@Configuration
public class ShiroConfig {
/**
* 创建Realm bean会让方法返回的对象放入到spring的环境,以便使用
*/
@Bean(name = "userRealm")
public UserRealm getRealm(){
return new UserRealm();
}
/**
* 创建DefaultWebSecurityManager
*/
//这里的传参有点特殊可以调用一个注解,这里有个细节,想看看注解区不区分大小写
//实测,会报错。。。所以是区分大小写的
// @Qualifier 注释指定注入 Bean 的名称,是用来消除歧义的
//这里也要有Bean
@Bean(name = "defaultWebSecurityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
DefaultWebSecurityManager defaultWebSecurityManager=new DefaultWebSecurityManager();
//关联realm,并且这个是需要传参的
defaultWebSecurityManager.setRealm(userRealm);
return defaultWebSecurityManager;
//感觉和直接return一个 new的一样吧 之所以不直接return是因为,会调用一个
//关联realm的方法
}
/**
* 创建shiroFilterFactoryBean
*/
//也是需要注解和参数的
//这里也是需要bean注解的
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("defaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean shiroFilterFactoryBean=new ShiroFilterFactoryBean();
//设置一个安全管理器来关联SecurityManager
shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);
//添加shiro内置过滤器
//先创建一个Map集合
Map<String,String> filterMap=new LinkedHashMap<String,String>();
//然后往里面添加东西
filterMap.put("/add","authc");
filterMap.put("/update","authc");
//也可以改成这样 但是是因为选择了templates下的所有,但是testThymeleaf 是不需要的,所有是需要将testThymeleaf改成anno
/* filterMap.put("/testThymeleaf","anon");
filterMap.put("/*","authc");
*/
//授权过滤器 这边使用的是perms,也就是该资源必须得到资源授权才可以访问
//所以当未授权的时候shiro就会自动跳转到一个未授权的页面
filterMap.put("/add","perms[user:add]");
/**
* 修改调整的登录页面
*/
//然后这个跳转的页面,就是需要control来进行自动装入这个页面
shiroFilterFactoryBean.setLoginUrl("/login");
//所以要设置未授权的页面
shiroFilterFactoryBean.setUnauthorizedUrl("/unAuth");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
return shiroFilterFactoryBean;
}
}
在controller加入授权页面
//这里增加一个授权页面
@RequestMapping("/unAuth")
public String unAuth(){
System.out.println("UserController.unAuth()");
//同理返回路径
return "unAuth";
}
并在templates下新建一个
unAuth.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>未授权提示页面</title>
</head>
<body>
你未授权
</body>
</html>
运行结果如下
修改一下UserRealm就行
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("执行授权逻辑");
//再访问了之后就可以进行修改
//给资源进行授权
SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
//添加资源的授权字符串,要和授权那边的字符串一致
info.addStringPermission("user:add");
return info;
}
这样子运行就没问题了