shiro认证时Realm的写法

第一种情况:

1:实现shiro的认证可以继承AuthenticatingRealm,并重写它的doGetAuthenticationInfo方法。

2:AuthenticatingRealm类的doGetAuthenticationInfo方法返回一个SimpleAuthenticationInfo对象,该对象里封装了要比对的凭证(即密码),然后把返回的SimpleAuthenticationInfo对象交给AuthenticatingRealm内部使用的CredentialsMatcher进行凭据验证。CredentialsMatcher会根据用户封装的UsernamePasswordToken和返回的SimpleAuthenticationInfo进行凭据的比对。账号的比对则在Realm内部由开发者完成。注意:这是普通明文密码的情况

3:如果是加盐的散列加密的密码,则需要给AuthenticatingRealm设置CredentialsMatcher,Shiro提供了CredentialsMatcher的散列实现HashedCredentialsMatcher,这样返回的SimpleAuthenticationInfo对象中不仅要带上密文密码,还要带上加密时的盐,这样以来HashedCredentialsMatcher可以根据用户封装的UsernamePasswordToken和返回的SimpleAuthenticationInfo进行凭据的比对。同样账号的比对则在Realm内部由开发者完成。注意:这是加盐散列密文密码的情况

4:返回的SimpleAuthenticationInfo对象的作用除了2和3中说的交给CredentialsMatcher进行凭据验证外,还有一个作用就是提供给SecurityManager,绑定到Subject上,这样我们可以通过subject来获取到认证通过的主体的信息,即SimpleAuthenticationInfo对象中的principal(我们可以把认证通过主体的基本信息都保存到principal中,这样就可以在代码的其他地方直接通过subject获取到主体的基本信息)。

第二种情况:

1:实现shiro的认证也可以实现Realm接口,并重写它的getAuthenticationInfo方法。

2:和第一种情况不同的是,我们要在getAuthenticationInfo方法中完成账号和密码的全部比对,因为Realm接口内部没有CredentialsMatcher可使用。

3:返回的SimpleAuthenticationInfo对象的唯一作用就是提供给SecurityManager,绑定到Subject上,这样我们可以通过subject来获取到认证通过的主体的信息,即SimpleAuthenticationInfo对象中的principal(我们可以把认证通过主体的基本信息都保存到principal中,这样就可以在代码的其他地方直接通过subject获取到主体的基本信息)。

原文地址:https://www.cnblogs.com/hzcya1995/p/13302484.html