sprinbboot4.整合shiro框架

直接看下代码结果

在这里插入图片描述
user目录下。还有add.html和update.html两个页面
引入依赖

<!--集成jdbc和mybatis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>
 <!--引入shiro框架 -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.4.0</version>
        </dependency>

        <!--thyleaf整合shiro-->
        <dependency>
            <groupId>com.github.theborakompanioni</groupId>
            <artifactId>thymeleaf-extras-shiro</artifactId>
            <version>2.0.0</version>
        </dependency>

一个实体类Users,两个表users和权限prems表
看下javabean文件
users类

@Data
public class Users {
    private Integer id;
    private String name;
    private String pwd;
    private Integer prems_id;//权限id
}

创建数据库sql语句的mapper

@Component
public interface UserMappers {
    @Select("select *from user where name=#{name}")
    Users selectByName(@Param("name") String name);

    @Select("select prems_name from prems where id=#{id}")
    String selectFindPrems(@Param("id") Integer prems_id);
}

创建一个serivce

@Service
public class UsersSerivce {
    @Autowired
    private UserMappers userMappers;
    //根据用户名查找用户的信息
    public Users findByNameUsers(String name){

        Users users=userMappers.selectByName(name);
        return users;
    }
    //根据用户的权限prems_id去查找对应的权限## 标题
    public String findUserPrems(Integer prems_id){
        String prems_name=userMappers.selectFindPrems(prems_id);
        return prems_name;
    }
}

准备工作结束进入正题‘

创建contrller–起始只要tologin一个请求(我这里的请求是项目全部写完的,正常来说需要哪个写那个,拦截器的请求根据自己需要在写)

@Controller
public class MyContreller {

    @GetMapping({"/","/index"}) //两个请求都可以进入
    public  String toIndex(){

        return "index";
    }

    @GetMapping("/user/add")
    public  String add(){
        return "user/add"; //返回user目录下的add页面
    }
    @GetMapping("/user/update")
    public  String update(){
        return "user/update"; //返回user目录下的add页面
    }
    @GetMapping("/tologin")
    public  String toLogin(){
        System.err.println("进入");
        return "login";
    }

    @GetMapping("/login")
    public String login(@RequestParam("username")String username,
                        @RequestParam("password")String password,
                        Model model){
        //获取当前用户
        Subject subject= SecurityUtils.getSubject();
        //封装用户数据
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
       try {
           //执行登录方法,,如果没有异常就说明登录成功
           subject.login(token); //执行这个就会执行UserRealm  的doGetAuthenticationInfor认证方法 。。根据返回的结果进行异常捕获
           return "/index"; //登录成功进入的请求
       }catch (UnknownAccountException e){
           //账号错误
           model.addAttribute("msg","用户名不正确");
           return "login";//返回登录页面
       }catch (IncorrectCredentialsException e){
           //密码错误
           model.addAttribute("msg","密码不正确");
           return "login";//返回登录页面
       }
    }

    //未授权页面
    @GetMapping("/noauth")
    @ResponseBody
    public  String  unauuothorizefd(){

        return "未授权不可以访问";
    }
}

创建一个UserRealm类继承AuthorizingRealm,其中有两个方法,一个是认证,一个是授权

public class UserRealm extends AuthorizingRealm {
    @Autowired
    private UsersSerivce usersSerivce;
    //授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.err.println("执行授权");
        /*
        * 数据库用户mashuai  权限:可以进入/user/add请求
        * 用户amdin  权限:可以进入/user/upadate请求
        * 用户zs  权限:以上两种请求都不可以
        * */
        SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
        //info.addStringPermission("look_add"); //默认给每个用户添加这个look_add权限
        //取出来当前的用户
        Subject subject= SecurityUtils.getSubject();
        Users currentUser = (Users) subject.getPrincipal();//取出当前用户
        //根据当前用户的prems_id查找出对应的权限+
        String prems_name=usersSerivce.findUserPrems(currentUser.getPrems_id());
        info.addStringPermission(prems_name);//为用户添加权限

        return info;
    }

    //认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        System.err.println("执行认证");
        //取出 subject.login(token);里面的token AuthenticationToken authenticationToken的对象就是封装号的用户账号密码
        UsernamePasswordToken userToken = (UsernamePasswordToken) authenticationToken;
        //从数据库取所有的账号面密码进行匹配
        Users users=usersSerivce.findByNameUsers(userToken.getUsername());
        //shiro不需要自己手动密码验证。如果密码错误会自己返回IncorrectCredentialsException异常
        if (users==null){
            return null;//如果查找不到就说明账号不存在。。会抛出UnknownAccountException错误
        }
        //这个地方就是登录成功的地方。可以把用户的的信息放进session或者cokies中,进行持久化
        //放进Shiro自带的sesion
        Subject curenntSubject=SecurityUtils.getSubject();
        Session session= curenntSubject.getSession();
        session.setAttribute("loginUsers",users);
        //将用户的唯一标识写入浏览器的cokies

        return new SimpleAuthenticationInfo(users,users.getPwd(),"");
        //三个参数:(存放当查询出来的用户对象用户授权认证,用户的密码,)
    }
}

创建ShiroConfig类,进行注入

@Configuration
public class ShiroConfig {
    //注入ShiroFilterFactriryBEa过滤器
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){

        ShiroFilterFactoryBean bean =new ShiroFilterFactoryBean();
        //设置安全管理器
        bean.setSecurityManager(defaultWebSecurityManager);
        //添加shiro内置的过滤器
        /*
        * anon:无需认证即可访问
        * authc:必须认证(不被验证直接拦截)
        * user:必须有记住我功能才可以用
        * role :拥有某个角色权限才可以访问
        * perms :权限设置
        *
        * */
        Map<String,String> filterMap=new LinkedHashMap<>();
        //权限设置
        filterMap.put("/user/add","perms[look_add]");//意思就是说经过/user/add请求的必须有look_add权限
        filterMap.put("/user/update","perms[look_update]");//意思就是说经过/user/add请求的必须有look_add权限
        filterMap.put("/","authc");//user/*任意请求需要验证
        filterMap.put("/user/*","authc");//user/*任意请求需要验证
        //设置
        bean.setFilterChainDefinitionMap(filterMap);//将拦截授权加入过滤器
        bean.setUnauthorizedUrl("/noauth");//未授权的跳传页面
        bean.setLoginUrl("/tologin");   //如果请求被拦截跳转的进入的请求

        return bean;
    }


    //注入DafaultWebSecurityManager
    @Bean
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){

        DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager();
        securityManager.setRealm(userRealm);
        return securityManager;
    }

    //注入realm  @Qualifier("userRealm")注解等于@Bean(name="userRealm") 就是绑定这个方法
    @Bean
    public UserRealm userRealm(){
        return  new UserRealm();
    }

    //整合thyleaf和shiro
    @Bean
    public ShiroDialect getShiroDialect(){
        return new ShiroDialect();
    }


}


创建ShiroConfig类,注入配置

@Configuration
public class ShiroConfig {
    //注入ShiroFilterFactriryBEa过滤器
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){

        ShiroFilterFactoryBean bean =new ShiroFilterFactoryBean();
        //设置安全管理器
        bean.setSecurityManager(defaultWebSecurityManager);
        //添加shiro内置的过滤器
        /*
        * anon:无需认证即可访问
        * authc:必须认证(不被验证直接拦截)
        * user:必须有记住我功能才可以用
        * role :拥有某个角色权限才可以访问
        * perms :权限设置
        *
        * */
        Map<String,String> filterMap=new LinkedHashMap<>();
        //权限设置
        filterMap.put("/user/add","perms[look_add]");//意思就是说经过/user/add请求的必须有look_add权限
        filterMap.put("/user/update","perms[look_update]");//意思就是说经过/user/add请求的必须有look_add权限
        filterMap.put("/","authc");//user/*任意请求需要验证
        filterMap.put("/user/*","authc");//user/*任意请求需要验证
        //设置
        bean.setFilterChainDefinitionMap(filterMap);//将拦截授权加入过滤器
        bean.setUnauthorizedUrl("/noauth");//未授权的跳传页面
        bean.setLoginUrl("/tologin");   //如果请求被拦截跳转的进入的请求

        return bean;
    }


    //注入DafaultWebSecurityManager
    @Bean
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){

        DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager();
        securityManager.setRealm(userRealm);
        return securityManager;
    }

    //注入realm  @Qualifier("userRealm")注解等于@Bean(name="userRealm") 就是绑定这个方法
    @Bean
    public UserRealm userRealm(){
        return  new UserRealm();
    }

    //整合thyleaf和shiro
    @Bean
    public ShiroDialect getShiroDialect(){
        return new ShiroDialect();
    }


}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值