本文共 3325 字,大约阅读时间需要 11 分钟。
承接上一篇博客:
这是下一篇博客: 首先要说的是,这个项目实战是参考自黑马,可以去对应视频看一看: 最后一篇主要的是实现shiro整合用户授权 首先在shiroConfig这边进行小小的改动 在filterMap这边加入这个filterMap.put("/add","perms[user:add]");
这边需要先用正确的账号密码登录
也就是未授权的错误然后继续修改
shiroConfigpackage 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;@Configurationpublic 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集合 MapfilterMap=new LinkedHashMap (); //然后往里面添加东西 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文件未授权提示页面 你未授权
运行结果如下
修改一下UserRealm就行@Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { System.out.println("执行授权逻辑"); //再访问了之后就可以进行修改 //给资源进行授权 SimpleAuthorizationInfo info=new SimpleAuthorizationInfo(); //添加资源的授权字符串,要和授权那边的字符串一致 info.addStringPermission("user:add"); return info; }
这样子运行就没问题了
转载地址:http://msfen.baihongyu.com/