0


Spring Boot学习篇(十二)

Spring Boot学习篇(十二)

shiro安全框架使用篇(四)

2 在主页显示用户登录状态、用户信息和完成默认注销(不改shiro原来的配置)操作

2.1 变更SysUserController类

2.1.1 在SysUserController类中注入sysUserMapper
@AutowiredSysUserMapper sysUserMapper;
2.1.2 在SysUserController类中的login()方法下面需要增加的代码
SysUser users = sysUserMapper.findUserByUsername(username);
session.setAttribute("users", users);
2.1.3 变更后的SysUserController类的完整代码如下所示
packagecom.zlz.controller;importcom.zlz.entity.SysUser;importcom.zlz.mapper.SysUserMapper;importcom.zlz.service.ISysUserService;importorg.apache.shiro.SecurityUtils;importorg.apache.shiro.authc.*;importorg.apache.shiro.subject.Subject;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.stereotype.Controller;importorg.springframework.web.servlet.mvc.support.RedirectAttributes;importjavax.servlet.http.HttpSession;@Controller@RequestMapping("/sysUser")publicclassSysUserController{//增加的代码①@AutowiredSysUserMapper sysUserMapper;@RequestMapping("login")publicStringlogin(String username,String password,RedirectAttributes ra,HttpSession session){//获取当前操作对象Subject subject =SecurityUtils.getSubject();//把用户名、密码存入token中UsernamePasswordToken token=newUsernamePasswordToken(username,password);try{
           subject.login(token);//增加的代码②SysUser users = sysUserMapper.findUserByUsername(username);
           session.setAttribute("users", users);return"index";}catch(UnknownAccountException e){
           ra.addFlashAttribute("msg","用户名错误");}catch(LockedAccountException e){
           ra.addFlashAttribute("msg","该用户被锁定,请联系管理员解锁");}catch(IncorrectCredentialsException e){
           ra.addFlashAttribute("msg","密码错误");}//重定向地址栏改变,但因为走的是视图解析器,那么他的地址栏是跟随视图解析器里面的地址栏变化的return"redirect:/";}@RequestMapping("tologin")publicStringtologin(){return"login";}//设置需要登录,但没有登录的方法@RequestMapping("unlogin")publicStringunlogin(RedirectAttributes ra){
       ra.addFlashAttribute("msg","请先登录");return"redirect:/sysUser/tologin";}}

2.2 变更index.html页面

2.2.1 增加的代码如下所示
<divth:if="${session.users!=null}">
    已登录 用户名:<spanth:text="${session.users.username}"></span><!--这个a标签里面的href的地址是自定义的地址--><ahref="/zhuxiao">注销</a></div><divth:if="${session.users==null}">未登录</div>
2.2.2 变更后的index.html页面的完整代码如下所示
<!DOCTYPEhtml><htmllang="en"xmlns:th="http://www.thymeleaf.org"><head><metacharset="UTF-8"><title>Title</title></head><body><h1>这是主页!!!!</h1><divth:if="${session.users!=null}">
        已登录 用户名:<spanth:text="${session.users.username}"></span><!--这个a标签里面的href的地址是自定义的地址--><ahref="/zhuxiao">注销</a></div><divth:if="${session.users==null}">未登录</div><ahref="/product/find">查询商品</a><ahref="/product/insert">添加商品</a><ahref="/product/update">修改商品</a><ahref="/product/delete">删除商品</a></body></html>

2.3 变更ShiroConfig类

2.3.1 增加的部分
map.put("/zhuxiao","logout");
2.3.2 变更后完整的ShiroConfig类代码如下所示
packagecom.zlz.config;importorg.apache.shiro.authc.credential.HashedCredentialsMatcher;importorg.apache.shiro.spring.web.ShiroFilterFactoryBean;importorg.apache.shiro.web.mgt.DefaultWebSecurityManager;importorg.apache.shiro.web.session.mgt.DefaultWebSessionManager;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importjava.util.LinkedHashMap;importjava.util.Map;@ConfigurationpublicclassShiroConfig{//安全管理器的配置@BeanpublicDefaultWebSecurityManagersecurityManager(){DefaultWebSecurityManager dws=newDefaultWebSecurityManager();
        dws.setRealm(mysqlRealm());//设置会话管理器,保证第一次访问的时候不会出错
        dws.setSessionManager(newDefaultWebSessionManager());return dws;}@Bean("shiroFilterFactoryBean")publicShiroFilterFactoryBeanfactoryBean(){ShiroFilterFactoryBean sffb=newShiroFilterFactoryBean();//设置安全管理器
        sffb.setSecurityManager(securityManager());//*****设置没有登录时需要跳转的地址
        sffb.setLoginUrl("/sysUser/unlogin");//**********过滤器配置(过滤器的地址有很多需要配置,因此需要保证顺序)Map<String,String> map=newLinkedHashMap<>();/**
         * 一个地址可以执行多个过滤器
         * 常用的几个过滤器
         *    annon 允许匿名访问(不需要登录)
         *    user 需要登录才能访问(包含记住我)
         *    authc 需要登录(强制登录,本次登录是输入密码进入的,不包含记住我)
         *    logout 注销
         *    roles 必须满足指定的所有角色
         *    perms 必须满足指定的所有权限
         *///*****规则 不拦截的(放行的)放上面,拦截的放在下面
        map.put("/zhuxiao","logout");//find地址表示不需要登录即可访问
        map.put("/product/find","anon");//表示除了find以外的地址,都需要登录才行,相当于先执行前面再去执行后面
        map.put("/product/*","user");
        sffb.setFilterChainDefinitionMap(map);//检测到没有权限时的跳转地址//        sffb.setUnauthorizedUrl("");return sffb;}@BeanpublicMysqlRealmmysqlRealm(){MysqlRealm mysqlRealm=newMysqlRealm();//变动的地方: 配置加密管理器 登录时 会使用该加密方式对输入的密码进行加密,再和数据库的密码进行比对HashedCredentialsMatcher hsm =newHashedCredentialsMatcher();
        hsm.setHashAlgorithmName("sha-256");//加密方式 与注册时保持一致
        hsm.setHashIterations(100);//散列次数 与注册时保持一致
        mysqlRealm.setCredentialsMatcher(hsm);return mysqlRealm;}}

2.4 测试

2.4.1 当访问localhost:8080时进入如下界面,此时页面显示未登录

在这里插入图片描述

2.4.2 当用户点击添加链接,进入登录界面并成功登录后,此时页面显示已登录和登录的用户名
a 点击添加链接后,进入登录界面

在这里插入图片描述

b 登录成功后进入如下所示的界面

在这里插入图片描述

2.4.3 点击注销按钮,会退回到默认访问界面(localhost:8080)

在这里插入图片描述


本文转载自: https://blog.csdn.net/SSS4362/article/details/128744334
版权归原作者 SSS4362 所有, 如有侵权,请联系我们删除。

“Spring Boot学习篇(十二)”的评论:

还没有评论