Shiro简单入门+个人理解(2)

今天开始了Shiro认证及授权的部分,认证及授权是Shiro的主要功能,虽然Shiro还具有加密等功能,但在实际开发时,很少会使用到,在公司一般都有自己的一套加密方式,具体我就不说话了,毕竟有保密协议

废话不多说开始吧

首先开始Shiro认证流程

身份认证:判定用户是否是系统的合法用户。

用户访问系统资源时的认证(对用户身份信息的认证)流程如下:

 

 

具体流程分析如下:

 

1)系统调用subject的login方法将用户信息提交给SecurityManager

2)SecurityManager将认证操作委托给认证器对象Authenticator

3)Authenticator将身份信息传递给Realm。

4)Realm访问数据库获取用户信息然后对信息进行封装并返回。

5)Authenticator 对realm返回的信息进行身份认证。

 

Controller类的实现

 @RequestMapping("doLogin")

       @ResponseBody

       public JsonResult doLogin(String username,String password){

           //1.获取Subject对象

           Subject subject=SecurityUtils.getSubject();

           //2.通过Subject提交用户信息,交给shiro框架进行认证操作

           //2.1对用户进行封装

           UsernamePasswordToken token=

           new UsernamePasswordToken(

                   username,//身份信息

                   password);//凭证信息

           //2.2对用户信息进行身份认证

           subject.login(token);

           //分析:

           //1)token会传给shiro的SecurityManager

           //2)SecurityManager将token传递给认证管理器

           //3)认证管理器会将token传递给realm

           return new JsonResult("login ok");

       }

}

 

 

自定义Realm(ShiroUserRealm)


/**
* 通过此对象获取用户身份相关信息,用户权限相关信息
* 间接的实现了Realm接口
*/
@Service
public class ShiroUserRealm extends AuthorizingRealm {//AuthenticatingRealm (提供了认证数据的获取方法)
//我在此处删除了相关的dao接口,它们只要应用于获取id

//同时在这里我未用到md5加密所以取消了加密方式

/**

     * 设置凭证匹配器

     * @param credentialsMatcher

     */

    @Override

    public void setCredentialsMatcher(

CredentialsMatcher credentialsMatcher) {

        HashedCredentialsMatcher cMatcher=

        new HashedCredentialsMatcher();

        cMatcher.setHashAlgorithmName("MD5");

        super.setCredentialsMatcher(cMatcher);

}

 

 


//自定义缓存map(缓存用户权限信息)
private Map<String,SimpleAuthorizationInfo> authorMap=
new ConcurrentHashMap<String,SimpleAuthorizationInfo>();


/**此方法提供认证数据的获取操作*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(
AuthenticationToken token)
throws AuthenticationException {

System.out.println("==获取用户认证信息==");
//1.获取用户名(从令牌对象获取)
UsernamePasswordToken upToken=
(UsernamePasswordToken)token;
String username=upToken.getUsername();
// String username=(String)token.getPrincipal();
// System.out.println("username="+username);
//2.基于用户名执行查询操作获取用户对象
User user=sysUserDao.findUserByUserName(username);
//3.对用户对象进行判定
//3.1判定用户是否存在
if(user==null)
throw new UnknownAccountException();
//4.对用户相关信息进行封装(密码)
SimpleAuthenticationInfo info=new SimpleAuthenticationInfo(
user,//principal (用户新身份)

//因为取消加密方式所以省去了

credentialsSalt, //credentialsSalt(盐)


user.getUSER_PWD(),//hashedCredentials(已加密的凭证)
getName());//realmName real name
//5.返回封装好的数据(返回给认证管理器)
return info;//交给认证管理器


}

@Override
protected AuthorizationInfo doGetAuthorizationInfo(
PrincipalCollection principals) {
return null;
}
}

此外自定义realm就已经结束

以下就是拦截

在shiro.xml里随心所欲的设置过滤规则

<!-- 定义过滤规则(哪些资源允许匿名访问,哪些资源必须授权访问)-->
<property name="FilterChainDefinitionMap">
<map>
<!-- 说明:anon表示允许匿名访问, authc表示授权访问-->

<entry key="/css/**" value="anon"/>
<entry key="/db_sql/**" value="anon"/>
<entry key="/images/**" value="anon"/>
<entry key="/js/**" value="anon"/>
<entry key="/META-INF/**" value="anon"/>
<entry key="/yzm/**" value="anon"/>

<entry key="/login/getLogins.do" value="anon"/>
<entry key="/doLogout.do" value="logout"/>
<entry key="/**" value="authc"/>


</map>
</property>
</bean>

 

正常使用就会产生如果你在浏览器进行url填写为授权访问路径,则会跳转你所规定的配置页面,配置页面详情看前一篇文章的spring-shiro.xml

posted @ 2019-02-16 16:46  只待时光静好  阅读(220)  评论(0编辑  收藏  举报