栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

前后端分离的项目整合shiro安全框架

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

前后端分离的项目整合shiro安全框架

1、前置路由守卫

前置路由守卫:就是在路由跳转前加上自己的一些业务代码,未登录之前输入其他路径,不放行,跳转至登录页面。

在main.js文件中加入以下代码

//把axios挂载到vue对象中,以后在vue中如果使用axios直接可以使用$http名称
Vue.prototype.$http = axios

//设置前置路由守卫 to:表示跳转至哪个路由,from:从哪个路由来,next:放行到指定路由
router.beforeEach((to, from, next) => {
  //获得跳转的路径
  var path = to.path;
  //是否为登录路由路径
  console.log(path==="/login");
  if (path==="/login"){
    //放行
    return next();
  }
  //其他路由路径,判断是否登录
  var token = sessionStorage.getItem("token");
  if (token){
    return next();
  }
  //跳转至登录
  return next("/login");
  console.log("这里是前置路由守卫")
})
2、整合shiro安全框架 2.1 依赖


    org.apache.shiro
    shiro-spring-boot-starter
    1.7.0
2.2 shiro配置类
@Configuration
public class ShiroConfig {
    @Bean
    public DefaultWebSecurityManager defaultWebSecurityManager(){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(realm());
        return securityManager;
    }
    @Bean
    public Realm realm(){
        MyRealm myRealm = new MyRealm();
        myRealm.setCredentialsMatcher(credentialsMatcher());
        return myRealm;
    }
    @Bean
    public CredentialsMatcher credentialsMatcher(){
        HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
        hashedCredentialsMatcher.setHashAlgorithmName("MD5");
        hashedCredentialsMatcher.setHashIterations(1024);
        return hashedCredentialsMatcher;
    }
    @Bean(value = "shiroFilter")
    public ShiroFilterFactoryBean shiroFilterFactoryBean(){
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager());
        Map map = new HashMap<>();
        map.put("/login","anon");
        map.put("/doc.html","anon");
        map.put("/swagger-ui.html", "anon");
        map.put("/webjars
        overflow-y: auto;
    }
    .el-aside>.el-menu{
        border: 0px;
    }
    .el-main {
        background-color:#F2F2F2;
        color: #333;
        text-align: center;
        padding: 0px 16px !important;
        height: calc(100vh - 61px); 
        overflow-y: auto;
    }

    body > .el-container {
        margin-bottom: 40px;
    }

    .el-container:nth-child(5) .el-aside,
    .el-container:nth-child(6) .el-aside {
        line-height: 260px;
    }

    .el-container:nth-child(7) .el-aside {
        line-height: 320px;
    }

    .avatar {
        width: 178px;
        height: 178px;
        display: block;
    }

4、退出功能 4.1 设置axios的基础路径
//设置axios的基础路径
axios.defaults.baseURL="http:localhost:8081";
4.2 前端
handleCommand(command){
    if (command=="exit"){
        axios.get("/exit").then(result=>{
            if (result.data.code==2000){
                this.$message.success(result.data.msg);
                sessionStorage.clear();
                this.$router.push("/login")
            }
        })
    }
},
4.3 后端
@GetMapping("/exit")
public CommonResult exit(HttpServletRequest request){
    String token = request.getHeader("token");
    if (redisTemplate.hasKey(token)){
        redisTemplate.delete(token);
        return new CommonResult(2000,"退出成功",null);
    }
    return new CommonResult(5000,"无效的token",null);
}
5、获取左侧菜单 5.1 前端
//左侧菜单栏
initLeftMenu(){
    this.$http.get("/permission/leftMenu").then(result=>{
        if (result.data.code===2000){
            this.leftMenu = result.data.data;
        }
    })
},
5.2 controller层
@RestController
@RequestMapping("/permission")
public class PermissionController {
    @Autowired
    private IPermissionService iPermissionService;
    @Autowired
    private RedisTemplate redisTemplate;

    @GetMapping("/leftMenu")
    public CommonResult leftMenu(HttpServletRequest request){
        String token = request.getHeader("token");
        ValueOperations valueOperations = redisTemplate.opsForValue();
        User user  = (User) valueOperations.get(token);
        String id = user.getId();
        List list = iPermissionService.selectPermissionByUserId(id);
        if (list.size()>0){
            return new CommonResult(2000,"左侧菜单查询成功",list);
        }
        return new CommonResult(5000,"查询失败",null);
    }
}
5.3 Permission.xml文件




    

5.4 service的实现类
@Service
public class PermissionServiceImpl extends ServiceImpl implements IPermissionService {

    @Autowired
    private PermissionMapper permissionMapper;

    @Override
    public List selectPermissionByUserId(String id) {
        List permissions = permissionMapper.selectPermissionByUserId(id);
        ArrayList firstMenus = new ArrayList<>();
        for (Permission p:permissions) {
            if (p.getPid().equals("1")){
                firstMenus.add(p);
            }
        }
        //为一级菜单设置二级菜单
        for (Permission first:firstMenus) {
            //根据一级菜单id 查询 该菜单得二级菜单。如果出现不确定有几级菜单 那么我们可以使用方法得递归调用
            first.setChildren(findChildren(permissions,first.getId()));
        }
        return firstMenus;
    }
    //递归方法
    List findChildren(List permissions,String id){
        ArrayList children = new ArrayList<>();
        for (Permission p : permissions) {
            if (p.getPid().equals(id)){
                children.add(p);
            }
        }
        for (Permission child:children){
            child.setChildren(findChildren(permissions,child.getId()));
        }
        return children;
    }
}
5.5 前端根据返回结果显示层级关系

    
        
            
            
                
                {{secondMenu.name}}
            
        
    

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1040121.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号