1.编写配置类config

1.1创建Userrealm-----里面是认证和授权的代码---继承里面的两个方法

//自定义的UserRealm    继承AuthorizingRealm
//继承AuthorizingRealm类实现里面的授权认证 方法
public class UserRealm extends AuthorizingRealm {
    //把service层添加进来
    @Autowired
    UserService userService;   //一个查询用户名是否存在的方法
    //授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("执行授权");
        //把权限给用户SimpleAuthorizationInfo
        SimpleAuthorizationInfo info=new SimpleAuthorizationInfo();
        //info.addStringPermission("user:add");//给这些用户授权
        //info.addStringPermission("user:update");
        //拿到当前用户的对象
        Subject subject= SecurityUtils.getSubject();
        User currUntUser=(User) subject.getPrincipal();//得到user对象
        //设置当前用户的权限
        //相当于info.addStringPermission("user:add");//给这些用户授权
        info.addStringPermission(currUntUser.getPrems());
        //返回一个info对象
        return info;
    }
    //认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        System.out.println("执行认证");
        //获取用户输入的信息
        UsernamePasswordToken userToken=(UsernamePasswordToken) authenticationToken;
        //查询出来的用户名保存到实体类
       User user= userService.queryUserService(userToken.getUsername());
        //判断用户名
        if(user==null){//等于null表示没有这个人
           return null;//表示输入的姓名和数据库不一样就抛出异常---UnknownAccountException
        }
        System.out.println("....................."+user.getPassword());
        //认证密码  Shiro做~    第一次参数当前用户的认证,第2个参数是密码,第3个参数是认证名
        return new SimpleAuthenticationInfo(user,user.getPassword(),"");
    }

2.创建ShiroConfig配置类----里面把Userrealm类实现

@Configuration      //表示这是一个配置类
public class ShiroConfig {
    //ShiroFilterFactoryBean
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager getDefaultWebSecurityManager){
        ShiroFilterFactoryBean bean=new ShiroFilterFactoryBean();
        //设置安全管理器
        bean.setSecurityManager(getDefaultWebSecurityManager);
        //添加shiro内置过滤器
        /**
         * anon:无需认证就可以用
         * authc:必须认证才可以访问
         * user:必须拥有记住我功能才可以使用
         * perms:拥有对某个资源的权限
         * role:拥有某个角色权限
         */
        Map<String ,String>filterMap=new LinkedHashMap<String, String>();
        //filterMap.put("/*","authc");//表示所有所有/开头的请求都拦截
        filterMap.put("/add","authc");//表示add页面认证后才可以访问---这里的路径写的是浏览器访问路径
        filterMap.put("/update","authc");
        bean.setFilterChainDefinitionMap(filterMap);
        bean.setLoginUrl("/toLog");//如果没有权限则跳转登录页面
        //授权,正常情况下会跳转至授权页面,授权要在拦截器下面
        filterMap.put("/add","perms[user:add]");//perms[user:add]表示user用户才可以访问add
        filterMap.put("/update","perms[user:update]");
        //跳转到未授权页面
        bean.setUnauthorizedUrl("/noLog");
        return bean;
    }

    //DefaultWebSecurity
    @Bean
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
        DefaultWebSecurityManager defaultWebSecurityManager=new DefaultWebSecurityManager();
        //关联UserRealm
        defaultWebSecurityManager.setRealm(userRealm);
        return defaultWebSecurityManager;
    }

    //创建realm对象  需要自定义类 装配到spring容器        UserRealm是一个自定义的类
    @Bean
    public UserRealm userRealm(){
        return new UserRealm();
    }


    //整合ShiroDialect  用来整合thyamel
    @Bean
    public ShiroDialect getShiroDialect(){
        return new ShiroDialect();
    }

3.控制层接收登录的数据

 @RequestMapping("/loging")
    public String loging(String name, String password, Model model){
        //获取当前用户
        Subject subject= SecurityUtils.getSubject();
        //封装登录的数据
        UsernamePasswordToken token=new UsernamePasswordToken(name,password);//放入进去进行加密
        try{
            subject.login(token);//执行登录方法
            return "index";
        }catch (UnknownAccountException e) {
        model.addAttribute("msg","用户名错误");
             return "login";
        }catch (IncorrectCredentialsException e) {
            model.addAttribute("msg","密码错误");
            return "login";
        }
    }
    @RequestMapping("/noLog")
    @ResponseBody
    public String noLog(){
        return "未授权,无法访问";
    }

4.整合thymeleaf


<html lang="en" xmlns:th="http://www.thymeleaf.org"
xmlns:shiro="http://www.thymeleaf.org/thymeleaf-extras-shiro">
<div shiro:hasPermission="user:add"> //如果权限等于user:add则显示add页面
<a th:href="@{/add}">add</a>
</div>

<hr>

<div shiro:hasPermission="user:update">
    <a th:href="@{/update}">update</a>
</div>    

 

5.需要的依赖

<!--整合shiro的jar包-->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.7.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>


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