首页 > 其他分享 >shrio QuickStart

shrio QuickStart

时间:2023-05-10 21:11:06浏览次数:30  
标签:return QuickStart shrio user org apache import shiro

Shrio三大对象:

 

 

 springboot整合shrio

登录拦截认证

创建项目时勾选web,导入依赖:

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.5.3</version>
</dependency>

自定义一个登录页面,shrio不同于spring-secruity给我做好了登录页面,我们需要自定义

login.html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>
<p th:text="${msg}" style="color:red;"></p>
<form th:action="@{/Login}" >
  <div>用户名:<input type="text"  name="username" placeholder="username"></div>
  <div>密码:<input type="password" name="password" placeholder="password"></div>
    <button>登录</button>
</form>
</body>
</html>
View Code

 

controller代码 测试是否成功拦截并跳转到登录页面

package com.lian.controller;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class MycController {
    @RequestMapping("/user/add")
    public String add(){
        return "add";
    }
    @RequestMapping("/user/update")
    public String UPDATE(){
        return "update";
    }

    @RequestMapping("/toLogin")
    public String toLogin(){
        return "login";
    }
    @RequestMapping("/Login")//接收到表单后要进行认证
    public  String login(String username, String password, Model model){
        //获取当前用户
        Subject subject= SecurityUtils.getSubject();
        //封装用户的登录数据
        UsernamePasswordToken token=new UsernamePasswordToken(username,password);
        try{
            subject.login(token);
            return "index";

        }
        catch (UnknownAccountException e){
            model.addAttribute("msg","用户名错误");
            return "login";
        }
        catch (IncorrectCredentialsException e){
            model.addAttribute("msg","密码错误");
            return "login";
        }
    }
}
View Code

 

登录拦截并认证配置代码

注意shrio自己帮我们进行了密码的认证,只需要传入password到类SimpleAuthenticationInfo的构造方法中即可

package com.lian.config;

import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

public class UserRealm extends AuthorizingRealm {
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("执行了=>授权doGetAuthorizationInfo");
        return null;
    }
    @Override//用户登录后要认证其拥有哪些权限,先伪造一个用户名和密码测试一下
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("执行力=>认证doGetAuthenticationInfo");
        String username="lian";
        String password="123";
        UsernamePasswordToken userToken=(UsernamePasswordToken)token;
       if(!userToken.getUsername().equals(username)){//前端传入的用户名和这里设置的不同
           //不同,抛出异常
           return null;//
       }
       return  new SimpleAuthenticationInfo("",password,"");
    }
}
View Code

启动主启动类同时在网页进行测试

 

 授权

用户在提交登录表单瞬间后台要判断用户拥有哪些权限,我们在数据库中新增 个字段perms代表用户权限,同时注意如果用户没有某个子页面的权限,那么在用户登录成功后就不用展示那个页面对应的超链接了,因此我们也需要整合thymeleaf和shrio

检查一下环境

public class UserRealm extends AuthorizingRealm {
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("执行了=>授权doGetAuthorizationInfo");
        return null;
    }
    @Override//用户登录后要认证其拥有哪些权限,先伪造一个用户名和密码测试一下代码有没有其他问题
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("执行力=>认证doGetAuthenticationInfo");
        String username="lian";
        String password="123";
        UsernamePasswordToken userToken=(UsernamePasswordToken)token;
       if(!userToken.getUsername().equals(username)){//前端传入的用户名和这里设置的不同
           //不同,抛出异常
           return null;//
       }
       return  new SimpleAuthenticationInfo("",password,"");
    }
}
View Code
思路:shiro登录认证的根本是先根据用户名查询出用户的账号密码等信息保存到
SimpleAuthenticationInfo中,试图登录的用户信息保存到UsernamePasswordToken中,
最后通过subject调用login方法实现登录信息的匹配对比。

1.创建项目时勾选web,导入thymeleaf依赖:

2.查看源码查看shrio中要授权用户的方法应该如何写

 测试代码:

UserRealm.java

package com.lian.config;

import com.lian.pojo.User;
import com.lian.service.UserService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;

public class UserRealm extends AuthorizingRealm {
    @Autowired
    UserService userService;
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("执行了=>授权doGetAuthorizationInfo");
        SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
        info.addStringPermission("user:add");
        //拿到当前登录的用户的对象
        Subject subject= SecurityUtils.getSubject();
        User currrentUser= (User) subject.getPrincipal();//拿到user对象
        //设置当前用户的权限
        info.addStringPermission(currrentUser.getPerms());
        return info;
    }
    @Override//用户登录后要认证其拥有哪些权限,先伪造一个用户名和密码测试一下
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("执行力=>认证doGetAuthenticationInfo");
       //token令牌
        UsernamePasswordToken userToken=(UsernamePasswordToken)token;
        //连接真实数据库,比较数据库的用户名和前端用户名是否一致
        User user= userService.queryUserByName(userToken.getUsername());
//        ,而shiro登录认证的根本是先根据用户名查询出用户的账号密码等信息保存到
//         SimpleAuthenticationInfo中,试图登录的用户信息保存到UsernamePasswordToken中,
//         最后通过subject调用login方法实现登录信息的匹配对比,
       if(user==null){//前端传入的用户名和这里设置的不同
           System.out.println("用户不存在!");
           return null;//报错
       }
         Subject currentSubject=SecurityUtils.getSubject();
        Session session=currentSubject.getSession();
        session.setAttribute("loginUser",user);
       return  new SimpleAuthenticationInfo(user,user.getPwd(),"");
    }
}
View Code

ShrioConfig

package com.lian.config;

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 ShrioConfig {
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManager defaultWebSecurityManager){
        ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean();
        //设置安全管理器
        bean.setSecurityManager(defaultWebSecurityManager);
        /*
        * 添加shrio的内置过滤器
        * anon:无需认证可以访问
        * anthc:必须认证才能访问
        * user:必须拥有记住我功能才能用
        * perms:拥有对某某个资源的权限才能访问
        * role:拥有某个角色权限才能访问*/
        //拦截
        Map<String,String> filterMap=new LinkedHashMap<>();
        //授权,正常情况下,没有授权会跳转到未授权的页面
        filterMap.put("/user/add","perms[user:add");
        filterMap.put("/user/add","perms[user:update");
        filterMap.put("/user/*","authc");
        bean.setFilterChainDefinitionMap(filterMap);

        //设置登录的请求
        bean.setLoginUrl("/toLogin");
        //未授权的页面,表明在用户点击某个a连接时发现未经认证,要走下面这个controller方法走
        bean.setUnauthorizedUrl("/noauth");
        return bean;
    }
    @Bean(name = "securityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm")UserRealm userRealm){
        DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager();
        //关联userRealm
        securityManager.setRealm(userRealm);
        return securityManager;
    }

    @Bean(name = "userRealm")
    //创建realm对象,需要自定义类
    public UserRealm realm(){
        return new UserRealm();
    }
}
View Code
前端thymeleaf和shiro整合




标签:return,QuickStart,shrio,user,org,apache,import,shiro
From: https://www.cnblogs.com/MyBlogs-joyiyii/p/17382902.html

相关文章

  • org.apache.maven.archetypes:maven-archetype-quickstart 这个是干啥的
    org.apache.maven.archetypes:maven-archetype-quickstart是一个Maven项目的骨架(archetype),用于快速创建一个简单的Maven项目。当我们在命令行执行:bashmvnarchetype:generate-DgroupId=com.example-DartifactId=my-project-Darchetype......
  • Spring Quickstart Guide同步构建测试
    进行了前置的配置后,打开IDEA,进行环境构建,第一次运行结果 把JDK更换为17版本后同步成功   输出结果  浏览器运行结果 ......
  • SpringBoot-----quickstart
    一、最简SpringBoot程序所包含的基础文件:pom.xml和Application类。spring官网同样可以快速构建springboot工程。 二、SpringBoot项目快速启动1、在lifecycle中双击pac......
  • [13] Zookeeper-QuickStart
    1.概述Zookeeper是一个开源的分布式的、为分布式框架提供协调服务的Apache项目。1.1工作机制Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服......
  • Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quicksta
     之前都是命令行创建,今天用eclipse装m2eclipse的时候装完后创建项目的时候报错:Couldnotresolvearchetypeorg.apache.maven.archetypes:maven-archetype-quickstart:REL......
  • AWS EKS-QuickStart-Deployment
    EKSAmazonElasticKubernetesService(AmazonEKS)是一项托管服务,可用于在上运行AWSKubernetes,而无需安装、操作和维护您自己的Kubernetes控制层面或节点。Kubernete......
  • Shrio与Spring Security
    Shrio与SpringSecuritySpringSecuritySpringSecurity是什么ShrioShrio是什么官网的介绍:是一个Java安全框架,可执行身份验证授权、加密和会话管理,并可用于保护任何应......
  • CDSW1.4的Models功能-创建和部署模型(QuickStart)
    温馨提示:如果使用电脑查看图片不清晰,可以使用手机打开文章单击文中的图片放大查看高清原图。Fayson的github:​​https://github.com/fayson/cdhproject​​提示:代码块部分可......
  • camunda_06_quickstart_springboot
    目标在SpringBoot项目中集成Camunda流程引擎,并启动启动一个流程实例了解集成Camunda需要调整哪些配置pom.xml最简单的方式是使用camunda的SpringBoot向导生成......
  • K8S使用Calico Quickstart安装问题
    ​昨天在最新的k8s1.24安装calico时,使用了calico的官方Quickstart文档,使用operator进行安装。结果发现poderr的问题。查看pod日志,发现为apiregistration.k8s.io使用的......