首页 > 其他 > 详细

shiro:授权,认证总结

时间:2021-01-06 13:58:18      阅读:26      评论:0      收藏:0      [点我收藏+]

1,shiro对象(Relam)的创建步骤

  工具类:目的是自定义(高级定制)授权和认证,

(1)ShiroFilterFactoryBean工厂:——》DefaultWebSecurityManager:-》创建 realm 对象,需要自定义类
  这个类的目的是高级定制一个
ShiroFilterFactoryBean工厂,生产自定义的Realm,
  在这里设置认证和授权
@Configuration
public class ShiroConfig {

    //ShiroFilterFactoryBean工厂:3
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager){
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        //设置安全管理器
        bean.setSecurityManager(defaultWebSecurityManager);

        //添加shiro内置过滤器
        /*
        * anon:无需认证就能访问
        * authc:必须认证才能访问
        * user:必须拥有记住我功能才能使用
        * perms:拥有对某个资源的权限才能访问
        * role:拥有某个角色权限才能访问
        * */
        //拦截
        Map<String, String> filterMap=new LinkedHashMap<>();
        //这里面的路径是请求路径
        filterMap.put("/user/add","perms[user:add]");
        filterMap.put("/user/update","authc");

        bean.setFilterChainDefinitionMap(filterMap);

        //设置登录请求
        bean.setLoginUrl("/toLogin");
        //设置未授权页面
        bean.setUnauthorizedUrl("/noauth");


        return bean;
    }

    //DefaultWebSecurityManager:2
    //@Qualifier作用,绑定指定的spring容器里的bean
    @Bean
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm")UserRealm userRealm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        //关联userRealm
        securityManager.setRealm(userRealm);
        return securityManager;
    }


    //创建 realm 对象,需要自定义类 :1
    @Bean(name = "userRealm")//被spring容器接管
    public UserRealm userRealm(){
        return new UserRealm();
    }

}

  (2)继承抽象类AuthorizingRealm,里面封装的就是自定义的ShiroFilterFactoryBean工厂生产后的产物

     在这个类自定义和重写认证和授权

//自定义的 UserRealm
    public class UserRealm extends AuthorizingRealm {

        @Autowired
        UserService userService;

        //授权
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
            System.out.println("执行了=>授权AuthorizationInfo");

            SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
            //info.addStringPermission("user:add");//授权写死,便于实验

            //拿到当前登录的这个对象
            Subject subject = SecurityUtils.getSubject();
            User currentUser =(User) subject.getPrincipal();//拿到user对象

            //设置当前用户的权限,数据从数据库取
            info.addStringPermission(currentUser.getPerms());

            return info;
        }


        //认证
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
            System.out.println("执行了=>认证AuthenticationInfo");

            UsernamePasswordToken userToken= (UsernamePasswordToken) token;
            //从真实数据库中拿数据
            User user = userService.queryUserByName(userToken.getUsername());
            if (user==null){
                return null;
            }

            //密码认证,shiro做
            return new SimpleAuthenticationInfo(user,user.getPwd(),"");

        }
    }

 

到这里shiro的认证和授权就结束了,最后就是结合controller层去去在前端体现了

controller层小demo

@Controller
public class MyController {
    //首页
    @RequestMapping({"/","/index"})
    public String toIndex(Model model){
        model.addAttribute("msg","Hello shiro");
        return "index";
    }

    @RequestMapping("user/add")
    public String add(){

        return "user/add";
    }

    @RequestMapping("user/update")
    public String update(){

        return "user/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);//执行登录方法,如果不报异常就success
            return "index";
        }catch (UnknownAccountException e){//用户名不存在
            model.addAttribute("msg","用户名错误");
            return "login";
        }catch (IncorrectCredentialsException e){//密码不存在
            model.addAttribute("msg","密码错误");
            return "login";
        }

    }

    @RequestMapping("/noauth")
    @ResponseBody
    public String unauthorized(){

        return "未经授权无法访问此页面";
    }

}

 

shiro:授权,认证总结

原文:https://www.cnblogs.com/CL-King/p/14240243.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!