一.Shiro简介

2017-09-05  本文已影响0人  蜗牛1991

一.是什么?

Apache Shiro是Java的一个安全框架。Shiro可以帮助我们完成:认证、授权、加密、会话管理、与Web集成、缓存等。
从外部看:应用代码直接交互的对象是Subject,也就是说Shiro的对外API核心就是Subject,Shiro不提供维护用户/权限,而是通过Realm让开发人员自己注入。


从内部看:通过Securty Manage管理外部请求的认证认证、授权、加密、会话管理、缓存等。对应组件是authenticator,Authorizer,session manager(自定义的sessionDao),cache manage


二.框架流程介绍

三.subject介绍**

四.SecurityManager组件介绍

1.Authorizer:


public class NormalRealm extends AuthorizingRealm{

    @Resource
    private AuthorityPermissionService permissionService;
    @Resource
    private AuthorityUsersService authorityUsersService;

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();//创建Shiro权限数据对象
        Integer userId = Integer.valueOf(principalCollection.toString());//获取当前用户ID
        AuthorityUsers users = this.authorityUsersService.findById(userId);
        if (users != null) {
            if (users.getAdministrator() == 1) {
                //如果是超级管理员,赋予所有权限
                authorizationInfo.addStringPermission("*");
            } 
        }
        return authorizationInfo;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
   
        return null;
    }
}

2. Authenticator(认证器)

public class NormalRealm extends AuthorizingRealm {
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        return null;
    }

    //认证
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
        Object principal = usernamePasswordToken.getPrincipal();
        Object credentials = usernamePasswordToken.getCredentials();
        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(principal, credentials, getName());
        return info;
    }
}

3. SessionManager(会话管理器)


    * DefaultSessionManager:DefaultSecurityManager使用的默认实现,用于JavaSE环境;
    * ServletContainerSessionManager:用于Web环境,其直接使用Servlet容器的会话;
    * DefaultWebSessionManager:用于Web环境的实现,可以替代2,自己维护着会话,直接废弃了Servlet容器的会话管理。


public class sessionLister implements SessionListener {
    @Override
    public void onStart(Session session) {   
    }
    @Override
    public void onStop(Session session) {
    }
    @Override
    public void onExpiration(Session session) {
    }
}
  @Bean
    public SessionManager sessionManager(RedisSessionDAO sessionDAO) {
        sessionManager.setSessionListeners( new sessionLister() );
        return sessionManager;
    }
@Component
public class RedisSessionDAO extends AbstractSessionDAO {
    @Resource(name = "redisTemplate")
    private ValueOperations<Serializable, Session> valueOperations;

    @Override
    public void update(Session session) throws UnknownSessionException {
        this.saveSession(session);
    }

    @Override
    public void delete(Session session) {
        if (session == null || session.getId() == null) {
            logger.error("session or session id is null");
            return;
        }
        valueOperations.getOperations().delete(session.getId());

    }

    //用来统计当前活动的session
    @Override
    public Collection<Session> getActiveSessions() {
        return sessions;
    }

    @Override
    protected Serializable doCreate(Session session) {
        return sessionId;
    }

    @Override
    protected Session doReadSession(Serializable sessionId) {
        return s;
    }
}
  @Bean
    public SessionManager sessionManager(RedisSessionDAO sessionDAO) {
        sessionManager.setSessionDAO(sessionDAO);
        return sessionManager;
    }
  @Bean
    public SessionManager sessionManager(SimpleCookie simpleCookie) {
        sessionManager.sessionIdCookie(sessionDAO);
        return sessionManager;
    }

4.缓存管理器

上一篇下一篇

猜你喜欢

热点阅读