安全框架Shiro框架_自定义Realm认证

用户登录—>分配角色---->(权限关联映射)---->鉴权(拥有什么什么权限);
认证授权2大主要任务,还有加密等。

认证:
shiro中的过滤器
过滤器的名称 Java 类
anon org.apache.shiro.web. lter.authc.AnonymousFilter
authc org.apache.shiro.web. lter.authc.FormAuthenticationFilter
authcBasic org.apache.shiro.web. lter.authc.BasicHttpAuthenticationFilter
roles org.apache.shiro.web. lter.authz.RolesAuthorizationFilter
perms org.apache.shiro.web. lter.authz.PermissionsAuthorizationFilter
user org.apache.shiro.web. lter.authc.UserFilter
logout org.apache.shiro.web. lter.authc.LogoutFilter
port org.apache.shiro.web. lter.authz.PortFilter
rest org.apache.shiro.web. lter.authz.HttpMethodPermissionFilter
ssl org.apache.shiro.web. lter.authz.SslFilter
anon: 匿名处理过滤器,即不需要登录即可访问;一般用于静态资源过滤;/static/=anon
authc: 表示需要认证(登录)才能使用;(放最后) /
=authc
logout: 注销过滤器 /logout=logout
roles: 角色授权过滤器,验证用户是否拥有资源角色; /employee/input=perms[“user:update”]

下面写一写关于自定义Realm–认证相关的东西:
1.获取用户名
token强转为UsernamePasswordToken–>getUsername()

2.2.以用户名为条件,查询mysql数据库,得到用户对象(用户名/密码)
模拟从数据库查询的对象 ------->自己new一个

3.将用户对象封装成认证info对象返回

如下代码:

  /*主要是用来进行身份认证的,也就是说验证用户输入的账号和密码是否正确。*/
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)
            throws AuthenticationException {

        //获取用户的输入的账号.
        String username = (String) token.getPrincipal();
        //通过username从数据库中查找 User对象,如果找到,没找到.
        //实际项目中,这里可以根据实际情况做缓存,如果不做,Shiro自己也是有时间间隔机制,2分钟内不会重复执行该方法
        SysAdmin userInfo = sysAdminService.findByUsername(username);
        if (userInfo == null) {
            return null;
        }
        SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
                userInfo, //用户信息
                userInfo.getPassword(), //密码
                getName()  //realm name
        );
        return authenticationInfo;
    }
  @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        Long userId = ShiroUtils.getSysAdminId();
        SysMenuService sysMenuService = (SysMenuService) SpringUtils.getBean("sysMenuServiceImpl");
        Set<String> perms = sysMenuService.getPermsList(userId);
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        info.setStringPermissions(perms);
        return info;
    }

//自定义matcher,这里就是对比用户的输入的信息封装成的token和按照用户输入的principal(一般就是用户名)从数据库中查询出的信息封装的info信息,一般就是比对他们的Credentials

public class MyCredentialsMatcher implements CredentialsMatcher {

    @Autowired
    private SysAdminService sysAdminService;

    @Override
    public boolean doCredentialsMatch(AuthenticationToken authenticationToken, AuthenticationInfo authenticationInfo) {
        UsernamePasswordToken utoken = (UsernamePasswordToken) authenticationToken;
        //获得用户输入的密码:(可以采用加盐(salt)的方式去检验)
        String inPassword = new String(utoken.getPassword());
        String username = utoken.getUsername();
        //获得数据库中的密码
        String dbPassword = (String) authenticationInfo.getCredentials();
        //进行密码的比对
        boolean flag = Objects.equals(inPassword, dbPassword);
        return flag;
    }
}

 @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        Long userId = ShiroUtils.getSysAdminId();
        SysMenuService sysMenuService = (SysMenuService) SpringUtils.getBean("sysMenuServiceImpl");
        Set<String> perms = sysMenuService.getPermsList(userId);
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        info.setStringPermissions(perms);
        return info;
    }

doGetAuthenticationInfo方法是用来按照用户输入的principal信息从数据库中查询,并将结果作为一个比对信息,比对2者的Credentials信息是否一致,比对时将调用比对器的doCredentialsMatch方法进行比对,所以我们可以在realm中配置自定义的比对器,重写此方法来达到自定义比对方法,实现特殊的比对逻辑.尤其是token中封装自定义对象时
.如果一致则登录成功.

而绿色的doGetAuthorizationInfo方法则是作为获取当前用户的角色权限相关信息的方法,此方法中要根据用户信息查询出相关的角色权限信息并封装进去.有了此信息之后就可以根据角色和权限信息进行访问权限的控制了.

参考资料和阅读:

https://blog.csdn.net/kentlhxy/article/details/116719968
https://blog.csdn.net/weixin_30519071/article/details/97817606

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值