zoukankan      html  css  js  c++  java
  • shiro

    https://blog.csdn.net/u011781521/article/details/55094751

    https://www.cnblogs.com/jpfss/p/8352031.html

    https://zhuanlan.zhihu.com/p/140946991

    1.Authentication:身份认证/登录

    2.Authorization:授权,即权限验证

    Subject:主体,代表了当前“用户”,这个用户不一定是一个具体的人,与当前应用交互的任何东西都是Subject,如网络爬虫,机器人等;即一个抽象概念;所有Subject都绑定到SecurityManager,与Subject的所有交互都会委托给SecurityManager;可以把Subject认为是一个门面;SecurityManager才是实际的执行者;


    public static Subject getSubject() {
    Subject subject = ThreadContext.getSubject();
    if (subject == null) {
    subject = (new Builder()).buildSubject();
    ThreadContext.bind(subject);
    }

    return subject;
    }


    SecurityManager:安全管理器;即所有与安全有关的操作都会与SecurityManager交互;且它管理着所有Subject;可以看出它是Shiro的核心,它负责与后边介绍的其他组件进行交互,如果学习过SpringMVC,你可以把它看成DispatcherServlet前端控制器;


    Realm:域,Shiro从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据源。

    也就是说对于我们而言,最简单的一个Shiro应用:

    1、应用代码通过Subject来进行认证和授权,而Subject又委托给SecurityManager;

    2、我们需要给Shiro的SecurityManager注入Realm,从而让SecurityManager能得到合法的用户及其权限进行判断。

    从以上也可以看出,Shiro不提供维护用户/权限,而是通过Realm让开发人员自己注入。

     

    Subject:主体

    访问系统的用户,主体可以是用户、程序等,进行认证的都称为主体;

    Principal:身份信息

    是主体(subject)进行身份认证的标识,标识必须具有唯一性,如用户名、手机号、邮箱地址等,一个主体可以有多个身份,但是必须有一个主身份(Primary Principal)。

    credential:凭证信息

    是只有主体自己知道的安全信息,如密码、证书等。

    1.3.1 Subject

    Subject即主体,外部应用与subject进行交互,subject记录了当前操作用户,将用户的概念理解为当前操作的主体,可能是一个通过浏览器请求的用户,也可能是一个运行的程序。Subject在shiro中是一个接口,接口中定义了很多认证授相关的方法,外部程序通过subject进行认证授,而subject是通过SecurityManager安全管理器进行认证授权

    1.3.2 SecurityManager

    SecurityManager即安全管理器,对全部的subject进行安全管理,它是shiro的核心,负责对所有的subject进行安全管理。通过SecurityManager可以完成subject的认证、授权等,实质上SecurityManager是通过Authenticator进行认证,通过Authorizer进行授权,通过SessionManager进行会话管理等。

    SecurityManager是一个接口,继承了Authenticator, Authorizer, SessionManager这三个接口。

    1.3.3 Authenticator

    Authenticator即认证器,对用户身份进行认证,Authenticator是一个接口,shiro提供ModularRealmAuthenticator实现类,通过ModularRealmAuthenticator基本上可以满足大多数需求,也可以自定义认证器。

    1.3.4 Authorizer

    Authorizer即授权器,用户通过认证器认证通过,在访问功能时需要通过授权器判断用户是否有此功能的操作权限。

    1.3.5 realm

    Realm即领域,相当于datasource数据源,securityManager进行安全认证需要通过Realm获取用户权限数据,比如:如果用户身份数据在数据库那么realm就需要从数据库获取用户身份信息。

    注意:不要把realm理解成只是从数据源取数据,在realm中还有认证授权校验的相关的代码。

     

     

     

     

    <!-- shiro -->
    <dependency>
    	<groupId>org.apache.shiro</groupId>
    	<artifactId>shiro-spring</artifactId>
    	<version>1.4.1</version>
    </dependency>


    自定义认证器MyShiroRealm

    添加MyShiroRealm并继承AuthorizingRealm,实现其中的两个方法。
    doGetAuthenticationInfo:实现用户认证,通过服务加载用户信息并构造认证对象返回。
    doGetAuthorizationInfo:实现权限认证,通过服务加载用户角色和权限信息设置进去。

     

    第一步 用户登录 生成Token

    第二步 客户端请求 请求header 传递token 

    AuthenticatingFilter 过滤器 重写
    createToken

    @Override
    protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) throws Exception {
    //获取请求token
    String token = getRequestToken((HttpServletRequest) request);

    if(StringUtils.isBlank(token)){
    return null;
    }

    return new Oauth2Token(token);
    }
    
    
    @Override
    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
    if(((HttpServletRequest) request).getMethod().equals(RequestMethod.OPTIONS.name())){
    return true;
    }

    return false;
    }

    @Override
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
    //获取请求token,如果token不存在,直接返回401
    String token = getRequestToken((HttpServletRequest) request);
    if(StringUtils.isBlank(token)){
    HttpServletResponse httpResponse = (HttpServletResponse) response;
    httpResponse.setContentType("application/json;charset=utf-8");
    httpResponse.setHeader("Access-Control-Allow-Credentials", "true");
    httpResponse.setHeader("Access-Control-Allow-Origin", HttpContextUtils.getOrigin());

    String json = new Gson().toJson(new Result().error(ErrorCode.UNAUTHORIZED));

    httpResponse.getWriter().print(json);

    return false;
    }

    return executeLogin(request, response);
    }
    小蚊子大人
  • 相关阅读:
    Javascript笔记01:javascript入门介绍
    css笔记19:浮动的案例
    css笔记17:盒子模型加强版的案例
    css笔记16:盒子模型的入门案例
    css笔记15:盒子模型
    css笔记14:css文件之间可以相互引用
    HDU 1203 I NEED A OFFER!
    HDU 2955 Robberies
    HDU 2602 Bone Collector
    HDU 2546 饭卡
  • 原文地址:https://www.cnblogs.com/ywsheng/p/15044448.html
Copyright © 2011-2022 走看看