logo
关于我们

技术分享

技术分享 Saiku去掉License验证信息以及数据备份

Saiku去掉License验证信息以及数据备份

2020-03-17

Saiku去掉License验证信息

终于还是走到了这一步,老早就在说要去掉这个License验证了,一直没做因为忙着别的。但是因为这个License还和可定义的用户数相关,限制了我们的使用,所以这里从saiku源码中做更改,去掉License验证。

 

需要更改的代码文件如下:

saiku-core\saiku-web\src\main\java\org\saiku\web\rest\resources\License.java
saiku-core\saiku-web\src\main\java\org\saiku\web\service\SessionService.java
saiku-ui\js\saiku\models\Session.js
saiku-ui\js\saiku\views\Upgrade.js

 

>>>后台代码更改  

1.更改SesseionService.java类中的 login方法,将有关于Licence验证的代码注释掉即可。改完后的login方法如下:

* @see org.saiku.web.service.ISessionService#login(javax.servlet.http.HttpServletRequest, java.lang.String, java.lang.String)
	 */
	/**modify the login for getting rid of license validate 2019-03-29*/
	public Map<String, Object> login(HttpServletRequest req, String username, String password ) throws LicenseException {
	//	Object sl = null;
	//	String notice = null;
		HttpSession session = ((HttpServletRequest)req).getSession(true);
		session.getId();
		sessionRepo.setSession(session);
//		try {
//			sl = l.getLicense();
//		} catch (Exception e) {
//			log.debug("Could not process license", e);
//			throw new LicenseException("Error fetching license. Get a free license from http://licensing.meteorite.bi. You can upload it at /upload.html");
//		}

//		if (sl != null) {

//			try {
//				l.validateLicense();
//			} catch (RepositoryException | IOException | ClassNotFoundException e) {
//				log.debug("Repository Exception, couldn't get license", e);
//				throw new LicenseException("Error fetching license. Please check your logs.");
//			}

			if (authenticationManager != null) {
			    authenticate(req, username, password);
			}
			if (SecurityContextHolder.getContext() != null
			    && SecurityContextHolder.getContext().getAuthentication() != null) {
			    Authentication auth = SecurityContextHolder.getContext().getAuthentication();

			    if (authorisationPredicate.isAuthorised(auth)) {
			        Object p = auth.getPrincipal();
			        createSession(auth, username, password);
			        return sessionHolder.get(p);
			    } else {
			        log.info(username + " failed authorisation. Rejecting login");
			        throw new RuntimeException("Authorisation failed for: " + username);
			    }
			}
			return new HashMap<>();
	}

  

2.更改License.java类中的getLicense方法,将License校验直接返回正确的结果。 改动后的代码getLicense方法如下:

@GET
  @Produces({ "application/json" })
  public Response getLicense() {
//    try {
//      return Response.ok().entity(licenseUtils.getLicense()).build();
//    } catch (IOException | RepositoryException | ClassNotFoundException e) {
//      e.printStackTrace();
//    }
    return Response.serverError().build();
  }

  

 >>>前端代码更改

3. 去掉Saiku升级相关提示,Upgrade.js文件中将render方法内容注释掉,详情如下:

render: function() {
/*
		var self = this;
		var license = new License();

		if(Settings.BIPLUGIN5){
				if(Saiku.session.get("notice") != undefined && Saiku.session.get("notice")!=null && Saiku.session.get("notice")!=""){
					$(this.el).append("<div><div id='uphead' class='upgradeheader'>Notice:"+Saiku.session.get("notice")+"</div>");

				}
				if (Settings.LICENSE.licenseType != undefined && (Settings.LICENSE.licenseType != "trial" && Settings.LICENSE.licenseType != "Open Source License")) {
					return this;
				}
				if (Settings.LICENSE != undefined && Settings.LICENSE.licenseType === "trial") {
					var yourEpoch = parseFloat(Settings.LICENSE.expiration);
					var yourDate = new Date(yourEpoch);
					self.remainingdays = self.daydiff(new Date(), yourDate);


					$(this.el).append("<div><div id='uphead' class='upgradeheader'>You are using a Saiku Enterprise" +
						" Trial license, you have "+ self.remainingdays+" days remaining. <a href='http://www.meteorite.bi/saiku-pricing'>Buy licenses online.</a></div>");
					return self;
				}
				else {
					$(this.el).append("<div><div id='uphead' class='upgradeheader'>You are using Saiku Community" +
						" Edition, please consider upgrading to <a target='_blank' href='http://meteorite.bi'>Saiku Enterprise</a>, or entering a <a href='http://meteorite.bi/products/saiku/sponsorship'>sponsorship agreement with us</a> to support development. " +
						"<a href='http://meteorite.bi/products/saiku/community'>Or contribute by joining our community and helping other users!</a></div></div>");

					return self;
				}
		}
		else {
				if(Saiku.session.get("notice") != undefined && Saiku.session.get("notice")!=null && Saiku.session.get("notice")!=""){
					$(this.el).append("<div><div id='uphead' class='upgradeheader'>Notice:"+Saiku.session.get("notice")+"</div>");

				}
				if (Settings.LICENSE.licenseType != undefined && (Settings.LICENSE.licenseType != "trial" &&
					Settings.LICENSE.licenseType != "Open Source License")) {
					return this;
				}
				if (Settings.LICENSE.licenseType === "trial") {
					var yourEpoch = parseFloat(Settings.LICENSE.expiration);
					var yourDate = new Date(yourEpoch);

					self.remainingdays = self.daydiff(new Date(), yourDate);

					$(this.el).append("<div><div id='uphead' class='upgradeheader'>You are using a Saiku Enterprise" +
						" Trial license, you have "+ self.remainingdays+" days remaining. <a href='http://www.meteorite.bi/saiku-pricing'>Buy licenses online.</a></div>");
					return self;
				}
				else {
					$(this.el).append("<div><div id='uphead' class='upgradeheader'>You are using Saiku Community" +
						" Edition, please consider upgrading to <a target='_blank' href='http://meteorite.bi'>Saiku Enterprise</a>, or entering a <a href='http://meteorite.bi/products/saiku/sponsorship'>sponsorship agreement with us</a> to support development. " +
						"<a href='http://meteorite.bi/products/saiku/community'>Or contribute by joining our community and helping other users!</a></div></div>");
					return self;
				}
		}




*/



	},

  

4.为了防止前台console中出现调用License接口404错误,我们还需要更改一下 Session.js的process_session与check_session方法,使其不调用License

check_session: function() {
		// This authentication cookie is used only by Orbis authentication strategy
		var authCookie = this.getCookie(Settings.ORBIS_AUTH.cookieName);

		if (Settings.ORBIS_AUTH.hazelcast_enabled && authCookie && !this.atemptedToLoginByCookie) {
            this.sessionid               = 1;
            this.username                = authCookie;
            this.password                = authCookie;
            this.atemptedToLoginByCookie = true;

            // In this case we inject the proper license attributes
            var ONE_YEAR = 31556952000;
            
            /**
            Settings.LICENSE = {
              licenseType: 'Orbis',
              expiration: Date.now() + ONE_YEAR
            }
            */
            this.login(authCookie, authCookie);
		} else {
			if (this.sessionid === null || this.username === null || this.password === null) {
				var that = this;
				this.clear();
				this.fetch({ success: this.process_session, error: this.brute_force });
			} else {
                if (!this.atemptedToLoginByCookie) {
                    this.username = encodeURIComponent(options.username);
                }

				this.load_session();
			}
		}
    },

 process_session: function(model, response) {
        if ((response === null || response.sessionid == null)) {
            // Open form and retrieve credentials
            Saiku.ui.unblock();
            if (Settings.DEMO) {
                this.form = new DemoLoginForm({ session: this });
            } else {
                this.form = new LoginForm({ session: this });
            }
            this.form.render().open();
        } else {
            this.sessionid = response.sessionid;
            this.roles = response.roles;
            this.isAdmin = Settings.ORBIS_AUTH.hazelcast_enabled || response.isadmin;
            this.username = encodeURIComponent(response.username);
            this.language = response.language;
            if (typeof this.language != "undefined" && this.language != Saiku.i18n.locale) {
                Saiku.i18n.locale = this.language;
                Saiku.i18n.automatic_i18n();
            }
            /**
                var license =new License();

                license.fetch_license('api/license/', function(opt) {
                    if (opt.status === 'success') {
                        Settings.LICENSE = opt.data.toJSON();
                    }
                    if(Saiku.session.isAdmin) {

                        var quota = new LicenseQuota();

                        quota.fetch_quota('api/license/quota', function (opt) {
                            if (opt.status === 'success') {
                                Settings.LICENSEQUOTA = opt.data.toJSON();
                            }
                        });
                    }

                });
			*/

            this.load_session();
        }

        return this;
    },

  

做出以上更改后,重新打包编译源码即可。

再次启动编译好的saiku,就会发现不需要上传License文件啦!可直接登录saiku进行使用~

而且还有个地方可以验证你是否已经成功取得License相关信息,使用admin登录控制管理台,看不到license就表示成功了!!

 

 

>>> Saiku数据备份

 关于saiku的数据备份,今日份尝试了一下,只需要将saiku-server目录下的 data,repository目录备份即可。(如果对saiku的源码有改动,重新编译了saiku ,建议将正在使用的saiku相关数据保存下来,免得自己再去配置。)

可直接去替换重新编译好的data , repository目录,在启动saiku,就会发现之前配置好的数据以及用户角色信息、文件信息都完好的保存了啦!!! 这就很赞啦嘻嘻嘻

 

 

 最后提供一下被更改过的完整的文件信息:(可直接用来替换本地的这个四个文件哦)

saiku-core\saiku-web\src\main\java\org\saiku\web\rest\resources\License.java

/* Copyright (C) OSBI Ltd - All Rights Reserved
 * Unauthorized copying of this file, via any medium is strictly prohibited
 * Proprietary and confidential
 * Written by OSBI LTD, 2014
 */

package org.saiku.web.rest.resources;

import org.saiku.service.license.ILicenseUtils;
import org.saiku.database.Database;
import org.saiku.service.license.Base64Coder;
import org.saiku.service.user.UserService;
import org.saiku.web.rest.objects.UserList;

import com.qmino.miredot.annotations.ReturnType;

import org.springframework.stereotype.Component;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.jcr.RepositoryException;
import javax.ws.rs.*;
import javax.ws.rs.core.Response;

/**
 * Saiku license information resource.
 *
 * @since 3.0
 * @author tbarber
 */
@Component
@Path("/saiku/api/license")
public class License {

  private ILicenseUtils licenseUtils;
  private UserService userService;

  public ILicenseUtils getLicenseUtils() {
    return licenseUtils;
  }

  public void setLicenseUtils(ILicenseUtils licenseUtils) {
    this.licenseUtils = licenseUtils;
  }

  private Database databaseManager;

  public Database getDatabaseManager() {
    return databaseManager;
  }

  public void setDatabaseManager(Database databaseManager) {
    this.databaseManager = databaseManager;
  }

  public void setUserService(UserService us) {
    userService = us;
  }

  /**
   * Get the saiku
   * @summary Get the Saiku License installed on the current server
   * @return A response containing a license object.
   */
  @GET
  @Produces({ "application/json" })
  public Response getLicense() {
//    try {
//      return Response.ok().entity(licenseUtils.getLicense()).build();
//    } catch (IOException | RepositoryException | ClassNotFoundException e) {
//      e.printStackTrace();
//    }
    return Response.serverError().build();
  }

  private static final int SIZE = 2048;


  /**
   * Upload a new license to the Saiku server.
   * @summary Upload a new license
   * @param is A license encapsulated in an input stream
   * @return An acknowledgement as to whether the server installation was successful.
   */
  @POST
  @Consumes("application/x-java-serialized-object")
  @Produces("text/plain")
  @ReturnType("java.lang.String")
  public Response saveLicense(InputStream is) {
    ObjectInputStream si = null;
    byte[] sig;
    byte[] data = null;
    try {
      si = new ObjectInputStream(is);
    } catch (IOException e) {
      e.printStackTrace();
    }

    try {
      int sigLength = si.readInt();
      sig = new byte[sigLength];
      si.read(sig);

      ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
      byte[] buf = new byte[SIZE];
      int len;
      while ((len = si.read(buf)) != -1) {
        dataStream.write(buf, 0, len);
      }
      dataStream.flush();
      data = dataStream.toByteArray();
      dataStream.close();
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      try {
        si.close();
      } catch (IOException e) {
        e.printStackTrace();
      }
    }


    getLicenseUtils().setLicense(new String(Base64Coder.encode(data)));

    return Response.ok("License Upload Successful").build();
  }

  /**
   * Validate the license installed on the server.
   * @summary License validation
   * @return A response indicating whether the operation was successful.
   */
  @GET
  @Path("/validate")
  @Produces({ "text/plain" })
  @ReturnType("java.lang.String")
  public Response validateLicense() {
//    if(!userService.isAdmin()){
//      return Response.status(Response.Status.FORBIDDEN).build();
//    }
//    try {
//      licenseUtils.validateLicense();
//    } catch (IOException e) {
//      e.printStackTrace();
//      return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
//                     .entity(e.getLocalizedMessage()).build();
//    } catch (ClassNotFoundException e) {
//      e.printStackTrace();
//      return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
//                     .entity(e.getLocalizedMessage()).build();
//    } catch (LicenseException e) {
//      return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
//                     .entity(e.getLocalizedMessage()).build();
//    } catch (RepositoryException e) {
//      return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
//                     .entity("Could not find license file").build();
//    } catch (Exception e) {
//      e.printStackTrace();
//    }
    return Response.ok().entity("Valid License").build();


  }


  /**
   * Get the current user list from the server.
   * @summary Get the user list
   * @return A list of users.
   */
  @GET
  @Path("/usercount")
  @Produces({"application/json"})
  @ReturnType("java.util.ArrayList<UserList>")
  public Response getUserCount(){
    if(!userService.isAdmin()){
      return Response.status(Response.Status.FORBIDDEN).build();
    }
    try {
      List<String> l = getAuthUsers();
      if(l!=null) {
        List<UserList> ul = new ArrayList();
        int i = 0;
        for (String l2 : l) {
          ul.add(new UserList(l2, i));
          i++;
        }
        return Response.ok().entity(ul.size()).build();
      }
    } catch (SQLException e) {
      e.printStackTrace();
      return Response.ok().entity(0).build();
    }
    return Response.ok().entity(0).build();
  }

  /**
   * Get the current user list from the server.
   * @summary Get the user list
   * @return A list of users.
   */
  @GET
  @Path("/users")
  @Produces({"application/json"})
  @ReturnType("java.util.ArrayList<UserList>")
  public Response getUserlist(){
    if(!userService.isAdmin()){
      return Response.status(Response.Status.FORBIDDEN).build();
    }
    try {
      List<String> l = getAuthUsers();
      if(l!=null) {
        List<UserList> ul = new ArrayList();
        int i = 0;
        for (String l2 : l) {
          ul.add(new UserList(l2, i));
          i++;
        }
        return Response.ok().entity(ul).build();
      }
    } catch (SQLException e) {
      e.printStackTrace();
    }
    return null;
  }

  /**
   * Upload a user list to the server.
   * @summary Upload user list
   * @param l A List of UserList objects
   * @return A response indicating whether the operation was successful.
   */
  @POST
  @Path("/users")
  @Produces({"text/plain"})
  @Consumes({"application/json"})
  @ReturnType("java.lang.String")
  public Response createUserList(List<UserList> l){
    try {
      List<String> l3 = new ArrayList<>();
      for(UserList l2 : l){
        l3.add(l2.getName());
      }
      addUsers(l3);
    } catch (SQLException e) {
      e.printStackTrace();
    }
    return Response.ok().entity("List created").build();

  }

  /**
   * Update the list of users with new users.
   * @summary Update user list
   * @param l A list of UserList objects
   * @return A response indicating whether the operation was successful.
   */
  @PUT
  @Path("/users")
  @Produces({"text/plain"})
  @Consumes({"application/json"})
  @ReturnType("java.lang.String")
  public Response updateUserList(List<UserList> l){
    try {
      List<String> l3 = new ArrayList<>();
      for(UserList l2 : l){
        l3.add(l2.getName());
      }
      updateUsers(l3);
    } catch (SQLException e) {
      e.printStackTrace();
    }
    return Response.ok().entity("List updated").build();

  }

  /**
   * Delete the user list from the server.
   * @summary Delete user list.
   * @return A response indicating whether the operation was successful.
   */
  @DELETE
  @Path("/users")
  @Produces({"application/json"})
  @ReturnType("java.lang.String")
  public Response deleteUserlist(){

    try {
      List<String> l = getAuthUsers();
      List<UserList> ul = new ArrayList<>();
      int i = 0;
      for(String l2 : l) {
        ul.add(new UserList(l2, i));
        i++;
      }
      return Response.ok().entity(ul).build();
    } catch (SQLException e) {
      e.printStackTrace();
    }
    return null;
  }

  /**
   * Get the valid users from the database.
   * @return a list of usernames
   * @throws SQLException
   */
  private List<String> getAuthUsers() throws SQLException {
    return databaseManager.getUsers();
  }

  /**
   * Get the user quota for existing users with no license
   * @return a list of user quota.
   */
  @GET
  @Produces("application/json")
  @Path("/quota")
  @ReturnType("java.util.List<UserQuota>")
  public Response getUserQuota(){
    if(!userService.isAdmin()){
      return Response.status(Response.Status.FORBIDDEN).build();
    }
    return Response.ok().entity(100000000).build();
  }


  /**
   * Add users to the database.
   * @param l List of usernames
   * @throws SQLException
   */
  public void addUsers(List<String> l) throws SQLException {
    databaseManager.addUsers(l);
  }

  /**
   * Add users to the database.
   * @param l List of usernames
   * @throws SQLException
   */
  public void updateUsers(List<String> l) throws SQLException {
    databaseManager.addUsers(l);
  }

}

  

saiku-core\saiku-web\src\main\java\org\saiku\web\service\SessionService.java 

/*  
 *   Copyright 2012 OSBI Ltd
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 */

package org.saiku.web.service;

import org.apache.commons.lang.StringUtils;
import org.saiku.repository.ScopedRepo;
import org.saiku.service.ISessionService;
import org.saiku.service.license.ILicenseUtils;

import bi.meteorite.license.LicenseException;
import bi.meteorite.license.SaikuLicense2;
import org.saiku.service.util.security.authorisation.AuthorisationPredicate;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.authentication.AnonymousAuthenticationToken;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.authentication.WebAuthenticationDetails;
import org.springframework.web.context.request.RequestContextHolder;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.jcr.RepositoryException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;


public class SessionService implements ISessionService {

	private static final Logger log = LoggerFactory.getLogger(SessionService.class);

	private AuthenticationManager authenticationManager;
	private AuthorisationPredicate authorisationPredicate;

	private final Map<Object,Map<String,Object>> sessionHolder = new HashMap<>();

	private Boolean anonymous = false;
	private ScopedRepo sessionRepo;
	private Boolean orbisAuthEnabled = false;

	public void setAllowAnonymous(Boolean allow) {
		this.anonymous  = allow;
	}

	private ILicenseUtils l;

	public ILicenseUtils getL() {
		return l;
	}

	public void setL(ILicenseUtils l) {
		this.l = l;
	}

	/* (non-Javadoc)
         * @see org.saiku.web.service.ISessionService#setAuthenticationManager(org.springframework.security.authentication.AuthenticationManager)
         */
	public void setAuthenticationManager(AuthenticationManager auth) {
		this.authenticationManager = auth;
	}

	public void setAuthorisationPredicate(AuthorisationPredicate authorisationPredicate)
	{
		this.authorisationPredicate = authorisationPredicate;
	}

	/* (non-Javadoc)
	 * @see org.saiku.web.service.ISessionService#login(javax.servlet.http.HttpServletRequest, java.lang.String, java.lang.String)
	 */
	/**modify the login for getting rid of license validate 2019-03-29*/
	public Map<String, Object> login(HttpServletRequest req, String username, String password ) throws LicenseException {
	//	Object sl = null;
	//	String notice = null;
		HttpSession session = ((HttpServletRequest)req).getSession(true);
		session.getId();
		sessionRepo.setSession(session);
//		try {
//			sl = l.getLicense();
//		} catch (Exception e) {
//			log.debug("Could not process license", e);
//			throw new LicenseException("Error fetching license. Get a free license from http://licensing.meteorite.bi. You can upload it at /upload.html");
//		}

//		if (sl != null) {

//			try {
//				l.validateLicense();
//			} catch (RepositoryException | IOException | ClassNotFoundException e) {
//				log.debug("Repository Exception, couldn't get license", e);
//				throw new LicenseException("Error fetching license. Please check your logs.");
//			}

			if (authenticationManager != null) {
			    authenticate(req, username, password);
			}
			if (SecurityContextHolder.getContext() != null
			    && SecurityContextHolder.getContext().getAuthentication() != null) {
			    Authentication auth = SecurityContextHolder.getContext().getAuthentication();

			    if (authorisationPredicate.isAuthorised(auth)) {
			        Object p = auth.getPrincipal();
			        createSession(auth, username, password);
			        return sessionHolder.get(p);
			    } else {
			        log.info(username + " failed authorisation. Rejecting login");
			        throw new RuntimeException("Authorisation failed for: " + username);
			    }
			}
			return new HashMap<>();
	}
	
	/** The old login validation , have to validate license information
	public Map<String, Object> login(HttpServletRequest req, String username, String password ) throws LicenseException {
		Object sl = null;
		String notice = null;
		HttpSession session = ((HttpServletRequest)req).getSession(true);
		session.getId();
		sessionRepo.setSession(session);
		try {
			sl = l.getLicense();
		} catch (Exception e) {
			log.debug("Could not process license", e);
			throw new LicenseException("Error fetching license. Get a free license from http://licensing.meteorite.bi. You can upload it at /upload.html");
		}

		if (sl != null) {

			try {
				l.validateLicense();
			} catch (RepositoryException | IOException | ClassNotFoundException e) {
				log.debug("Repository Exception, couldn't get license", e);
				throw new LicenseException("Error fetching license. Please check your logs.");
			}

			try {
				if (l.getLicense() instanceof SaikuLicense2) {

                    if (authenticationManager != null) {
                        authenticate(req, username, password);
                    }
                    if (SecurityContextHolder.getContext() != null
                        && SecurityContextHolder.getContext().getAuthentication() != null) {
                        Authentication auth = SecurityContextHolder.getContext().getAuthentication();

                        if (authorisationPredicate.isAuthorised(auth)) {
                            Object p = auth.getPrincipal();
                            createSession(auth, username, password);
                            return sessionHolder.get(p);
                        } else {
                            log.info(username + " failed authorisation. Rejecting login");
                            throw new RuntimeException("Authorisation failed for: " + username);
                        }
                    }
                    return new HashMap<>();
                }
			} catch (IOException | ClassNotFoundException | RepositoryException e) {
				log.debug("Repository Exception, couldn't get license", e);
				throw new LicenseException("Error fetching license. Please check your logs.");
			}
		}
		return null;
	}
*/
	private void createSession(Authentication auth, String username, String password) {

		if (auth ==  null || !auth.isAuthenticated()) {
			return;
		}
		
		boolean isAnonymousUser = (auth instanceof AnonymousAuthenticationToken);		
		Object p = auth.getPrincipal();
		String authUser = getUsername(p);
		boolean isAnonymous = (isAnonymousUser || StringUtils.equals("anonymousUser", authUser));
		boolean isAnonOk = (!isAnonymous || (isAnonymous && anonymous));
			
		if (isAnonOk && auth.isAuthenticated() && p != null && !sessionHolder.containsKey(p)) {
			Map<String, Object> session = new HashMap<>();
			
			if (isAnonymous) {
				log.debug("Creating Session for Anonymous User");
			}
			
			if (StringUtils.isNotBlank(username)) {
				session.put("username", username);
			} else {
				session.put("username", authUser);
			}
			if (StringUtils.isNotBlank(password)) {
				session.put("password", password);		
			}
			session.put("sessionid", UUID.randomUUID().toString());
			session.put("authid", RequestContextHolder.currentRequestAttributes().getSessionId());
			List<String> roles = new ArrayList<>();
			for (GrantedAuthority ga : SecurityContextHolder.getContext().getAuthentication().getAuthorities()) {
				roles.add(ga.getAuthority());
			}
			session.put("roles", roles);
			
			sessionHolder.put(p, session);
		}

	}

	private String getUsername(Object p) {
		
		if (p instanceof UserDetails) {
			  return ((UserDetails)p).getUsername();
		} 
		return p.toString();
	}

	/* (non-Javadoc)
	 * @see org.saiku.web.service.ISessionService#logout(javax.servlet.http.HttpServletRequest)
	 */
	public void logout(HttpServletRequest req) {
		if (SecurityContextHolder.getContext() != null && SecurityContextHolder.getContext().getAuthentication() != null) {
			Object p = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
			if (sessionHolder.containsKey(p)) {
				sessionHolder.remove(p);
			}
		}

		SecurityContextHolder.getContext().setAuthentication(null);
		SecurityContextHolder.clearContext();

		HttpSession session = req.getSession(false);

		if (session != null && !orbisAuthEnabled) { // Just invalidate if not under orbis authentication workflow
			session.invalidate();
		}
	}

	/* (non-Javadoc)
	 * @see org.saiku.web.service.ISessionService#authenticate(javax.servlet.http.HttpServletRequest, java.lang.String, java.lang.String)
	 */
	public void authenticate(HttpServletRequest req, String username, String password) {
		try {
			UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);
			token.setDetails(new WebAuthenticationDetails(req));
			Authentication authentication = this.authenticationManager.authenticate(token);
			log.debug("Logging in with [{}]", authentication.getPrincipal());
			SecurityContextHolder.getContext().setAuthentication(authentication);
		}
		catch (BadCredentialsException bd) {
			throw new RuntimeException("Authentication failed for: " + username, bd);
		}

	}

	/* (non-Javadoc)
	 * @see org.saiku.web.service.ISessionService#getSession(javax.servlet.http.HttpServletRequest)
	 */
	public Map<String,Object> getSession() {
		if (SecurityContextHolder.getContext() != null && SecurityContextHolder.getContext().getAuthentication() != null) {			
			Authentication auth = SecurityContextHolder.getContext().getAuthentication();
			Object p = auth.getPrincipal();

		  if (sessionHolder.containsKey(p)) {
			  Map<String, Object> r = new HashMap<>();
			  r.putAll(sessionHolder.get(p));
			  r.remove("password");

			  if (!r.containsKey("sessionid")) {
			    r.put("sessionid", UUID.randomUUID().toString());
			  }

			  return r;
		  }
		}

		return new HashMap<>();
	}
	
	public Map<String,Object> getAllSessionObjects() {
		if (SecurityContextHolder.getContext() != null && SecurityContextHolder.getContext().getAuthentication() != null) {			
			Authentication auth = SecurityContextHolder.getContext().getAuthentication();
			Object p = auth.getPrincipal();
			//createSession(auth, null, null);
			if (sessionHolder.containsKey(p)) {
				Map<String,Object> r = new HashMap<>();
				r.putAll(sessionHolder.get(p)); 
				return r;
			}

		}
		return new HashMap<>();
	}

  public void clearSessions(HttpServletRequest req, String username, String password) throws Exception {
	if (authenticationManager != null) {
	  authenticate(req, username, password);
	}
	if (SecurityContextHolder.getContext() != null && SecurityContextHolder.getContext().getAuthentication() != null) {
	  Authentication auth = SecurityContextHolder.getContext().getAuthentication();
	  Object p = auth.getPrincipal();
	  if (sessionHolder.containsKey(p)) {
		sessionHolder.remove(p);
	  }
	}


  }


	public void setSessionRepo(org.saiku.repository.ScopedRepo sessionRepo) {
		this.sessionRepo = sessionRepo;
	}

	public Boolean isOrbisAuthEnabled() {
		return orbisAuthEnabled;
	}

	public void setOrbisAuthEnabled(Boolean orbisAuthEnabled) {
		this.orbisAuthEnabled = orbisAuthEnabled;
	}
}

 

saiku-ui\js\saiku\models\Session.js 

/*
 *   Copyright 2012 OSBI Ltd
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 */

/**
 * Object which handles authentication and stores connections and cubes
 * @param username
 * @param password
 * @returns {Session}
 */
var Session = Backbone.Model.extend({
    username: null,
    password: null,
    sessionid: null,
    upgradeTimeout: null,
    isAdmin: Settings.ORBIS_AUTH.hazelcast_enabled,
    id: null,
	atemptedToLoginByCookie: false,
    initialize: function(args, options) {
        // Attach a custom event bus to this model
        _.extend(this, Backbone.Events);
        _.bindAll(this, "check_session", "process_session", "load_session","login", "brute_force");
        // Check if credentials are being injected into session
        if (options && options.username && options.password) {
            this.username = options.username;
            this.password = options.password;
            if (!Settings.DEMO) {
                this.save({username:this.username, password:this.password},{success: this.check_session, error: this.check_session});
            } else {
                this.check_session();
            }

        } else {
            this.check_session();
        }
    },

    check_session: function() {
		// This authentication cookie is used only by Orbis authentication strategy
		var authCookie = this.getCookie(Settings.ORBIS_AUTH.cookieName);

		if (Settings.ORBIS_AUTH.hazelcast_enabled && authCookie && !this.atemptedToLoginByCookie) {
            this.sessionid               = 1;
            this.username                = authCookie;
            this.password                = authCookie;
            this.atemptedToLoginByCookie = true;

            // In this case we inject the proper license attributes
            var ONE_YEAR = 31556952000;
            
            /**
            Settings.LICENSE = {
              licenseType: 'Orbis',
              expiration: Date.now() + ONE_YEAR
            }
            */
            this.login(authCookie, authCookie);
		} else {
			if (this.sessionid === null || this.username === null || this.password === null) {
				var that = this;
				this.clear();
				this.fetch({ success: this.process_session, error: this.brute_force });
			} else {
                if (!this.atemptedToLoginByCookie) {
                    this.username = encodeURIComponent(options.username);
                }

				this.load_session();
			}
		}
    },

	getCookie: function(name) {
		var value = "; " + document.cookie;
		var parts = value.split("; " + name + "=");
        
		if (parts.length == 2) {
            var cookieVal = parts.pop().split(";").shift();
            return cookieVal;
        }
	},

	/**
	 * This is a complete hack to get the BI platform plugin working.
	 * @param obj
	 */
	brute_force: function(model, response){
		this.clear();
		this.fetch({ success: this.process_session, error: this.show_error });
	},
	show_error: function(model, response){

		// Open form and retrieve credentials
		Saiku.ui.unblock();
		this.form = new SessionErrorModal({ issue: response.responseText });
		this.form.render().open();


	},

    load_session: function() {
        this.sessionworkspace = new SessionWorkspace();
    },

    process_session: function(model, response) {
        if ((response === null || response.sessionid == null)) {
            // Open form and retrieve credentials
            Saiku.ui.unblock();
            if (Settings.DEMO) {
                this.form = new DemoLoginForm({ session: this });
            } else {
                this.form = new LoginForm({ session: this });
            }
            this.form.render().open();
        } else {
            this.sessionid = response.sessionid;
            this.roles = response.roles;
            this.isAdmin = Settings.ORBIS_AUTH.hazelcast_enabled || response.isadmin;
            this.username = encodeURIComponent(response.username);
            this.language = response.language;
            if (typeof this.language != "undefined" && this.language != Saiku.i18n.locale) {
                Saiku.i18n.locale = this.language;
                Saiku.i18n.automatic_i18n();
            }
            /**
                var license =new License();

                license.fetch_license('api/license/', function(opt) {
                    if (opt.status === 'success') {
                        Settings.LICENSE = opt.data.toJSON();
                    }
                    if(Saiku.session.isAdmin) {

                        var quota = new LicenseQuota();

                        quota.fetch_quota('api/license/quota', function (opt) {
                            if (opt.status === 'success') {
                                Settings.LICENSEQUOTA = opt.data.toJSON();
                            }
                        });
                    }

                });
			*/

            this.load_session();
        }

        return this;
    },

    error: function() {
        $(this.form.el).dialog('open');
    },

    login: function(username, password) {
        var that = this;
        this.save({username:username, password:password},{dataType: "text", success: this.check_session, error: function(model, response){
            that.login_failed(response.responseText);
        }});

    },
    login_failed: function(response){
        this.form = new LoginForm({ session: this });
        this.form.render().open();
        this.form.setError(response);
    },
    logout: function() {
        // FIXME - This is a hack (inherited from old UI)
        Saiku.ui.unblock();
        $('#header').empty().hide();
        $('#tab_panel').remove();
        Saiku.tabs = new TabSet();
        Saiku.toolbar.remove();
        Saiku.toolbar = new Toolbar();

        if (typeof localStorage !== "undefined" && localStorage) {
            localStorage.clear();
        }

        this.set('id', _.uniqueId('queryaction_'));
        this.destroy({async: false });

        this.clear();
        this.sessionid = null;
        this.username = null;
        this.password = null;
		this.roles = null;
        this.isAdmin = false;
        this.destroy({async: false });
        //console.log("REFRESH!");
        document.location.reload(false);


    },

    url: function() {

        return "session";
    }
});

 

saiku-ui\js\saiku\views\Upgrade.js

 

/*
 *   Copyright 2012 OSBI Ltd
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 */

/**
 * The global toolbar
 */
var Upgrade = Backbone.View.extend({

	events: {
	},


	initialize: function(a, b) {

		this.workspace = a.workspace;

		// Fire off workspace event
		this.workspace.trigger('workspace:toolbar:render', {
			workspace: this.workspace
		});

	},

	daydiff: function(first, second) {
		return Math.round((second-first)/(1000*60*60*24));
	},

	render: function() {
/*
		var self = this;
		var license = new License();

		if(Settings.BIPLUGIN5){
				if(Saiku.session.get("notice") != undefined && Saiku.session.get("notice")!=null && Saiku.session.get("notice")!=""){
					$(this.el).append("<div><div id='uphead' class='upgradeheader'>Notice:"+Saiku.session.get("notice")+"</div>");

				}
				if (Settings.LICENSE.licenseType != undefined && (Settings.LICENSE.licenseType != "trial" && Settings.LICENSE.licenseType != "Open Source License")) {
					return this;
				}
				if (Settings.LICENSE != undefined && Settings.LICENSE.licenseType === "trial") {
					var yourEpoch = parseFloat(Settings.LICENSE.expiration);
					var yourDate = new Date(yourEpoch);
					self.remainingdays = self.daydiff(new Date(), yourDate);


					$(this.el).append("<div><div id='uphead' class='upgradeheader'>You are using a Saiku Enterprise" +
						" Trial license, you have "+ self.remainingdays+" days remaining. <a href='http://www.meteorite.bi/saiku-pricing'>Buy licenses online.</a></div>");
					return self;
				}
				else {
					$(this.el).append("<div><div id='uphead' class='upgradeheader'>You are using Saiku Community" +
						" Edition, please consider upgrading to <a target='_blank' href='http://meteorite.bi'>Saiku Enterprise</a>, or entering a <a href='http://meteorite.bi/products/saiku/sponsorship'>sponsorship agreement with us</a> to support development. " +
						"<a href='http://meteorite.bi/products/saiku/community'>Or contribute by joining our community and helping other users!</a></div></div>");

					return self;
				}
		}
		else {
				if(Saiku.session.get("notice") != undefined && Saiku.session.get("notice")!=null && Saiku.session.get("notice")!=""){
					$(this.el).append("<div><div id='uphead' class='upgradeheader'>Notice:"+Saiku.session.get("notice")+"</div>");

				}
				if (Settings.LICENSE.licenseType != undefined && (Settings.LICENSE.licenseType != "trial" &&
					Settings.LICENSE.licenseType != "Open Source License")) {
					return this;
				}
				if (Settings.LICENSE.licenseType === "trial") {
					var yourEpoch = parseFloat(Settings.LICENSE.expiration);
					var yourDate = new Date(yourEpoch);

					self.remainingdays = self.daydiff(new Date(), yourDate);

					$(this.el).append("<div><div id='uphead' class='upgradeheader'>You are using a Saiku Enterprise" +
						" Trial license, you have "+ self.remainingdays+" days remaining. <a href='http://www.meteorite.bi/saiku-pricing'>Buy licenses online.</a></div>");
					return self;
				}
				else {
					$(this.el).append("<div><div id='uphead' class='upgradeheader'>You are using Saiku Community" +
						" Edition, please consider upgrading to <a target='_blank' href='http://meteorite.bi'>Saiku Enterprise</a>, or entering a <a href='http://meteorite.bi/products/saiku/sponsorship'>sponsorship agreement with us</a> to support development. " +
						"<a href='http://meteorite.bi/products/saiku/community'>Or contribute by joining our community and helping other users!</a></div></div>");
					return self;
				}
		}




*/



	},

	call: function(e) {
	}

});

 

  

 

 

=================二次更新= (第一次通过操作以上步骤确实能正常打包编译saiku然后启动 也不需要上传license验证信息,但是我最近重新编译源码的时候发现license相关报错了。。)===start=========

 

所以我们开始根据报错信息找到配置文件 saiku-beans.xml文件,将关于License的bean注入都给注释掉,然后sessionService中的License对象注入也注释掉,以及plugin中的license也注释掉

 

需要注释的内容:

 

SessionService.java

 

/*private ILicenseUtils l;

	public ILicenseUtils getL() {
		return l;
	}

	public void setL(ILicenseUtils l) {
		this.l = l;
	}*/  

 

saiku-beans.xml

 

<!--  <bean id="licenseUtilsBean" class="org.saiku.service.license.LicenseUtils" init-method="init">
        <property name="repositoryDatasourceManager" ref="repositoryDsManager" />
    </bean>
 -->

 <bean id="sessionService" class="org.saiku.web.service.SessionService">
        <property name="authenticationManager" ref="authenticationManager"/>
       <property name="sessionRepo" ref="sessionRepo"/>
        <property name="authorisationPredicate" ref="authorisationPredicate"/>
       <!--  <property name="l" ref="licenseUtilsBean"/> -->
        <property name="orbisAuthEnabled" value="${orbis.auth.enabled}"/> 
        <!-- <property name="allowAnonymous" value="true" />   -->
    </bean>

   <!--  <bean id="licenseUtils" class="org.saiku.service.license.LicenseUtils">
        <property name="repositoryDatasourceManager" ref="repositoryDsManager"/>
    </bean> -->
   <!--  <bean id="licenseBean" class="org.saiku.web.rest.resources.License">
        <property name="databaseManager" ref="h2database"/>
        <property name="licenseUtils" ref="licenseUtils"/>
        <property name="userService" ref="userServiceBean"/>
    </bean> -->

 

plugin.spring.xml

 

<bean id="sessionService" class="org.saiku.plugin.PentahoSessionServiceSeven">
		<property name="userService" ref="userServiceBean"/>
		<!-- <property name="l" ref="licenseUtilsBeanPlugin"/> -->
	</bean>


	<!-- <bean id="licenseUtilsBeanPlugin" class="org.saiku.plugin.LicenseUtils" init-method="init">
		<property name="repositoryDatasourceManager" ref="repositoryDsManager"/>
	</bean> -->

	<!-- <bean id="licenseBean" class="org.saiku.plugin.resources.PentahoLicenseResource">
		<property name="licenseUtils" ref="licenseUtilsBeanPlugin"/>
		<property name="userService" ref="userServiceBean"/>
	</bean> -->

 

  

 

完整的SessionService.java

 

/*  
 *   Copyright 2012 OSBI Ltd
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 */

package org.saiku.web.service;

import org.apache.commons.lang.StringUtils;
import org.saiku.repository.ScopedRepo;
import org.saiku.service.ISessionService;
import org.saiku.service.license.ILicenseUtils;

import bi.meteorite.license.LicenseException;
import bi.meteorite.license.SaikuLicense2;
import org.saiku.service.util.security.authorisation.AuthorisationPredicate;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.authentication.AnonymousAuthenticationToken;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.authentication.WebAuthenticationDetails;
import org.springframework.web.context.request.RequestContextHolder;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.jcr.RepositoryException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;


public class SessionService implements ISessionService {

	private static final Logger log = LoggerFactory.getLogger(SessionService.class);

	private AuthenticationManager authenticationManager;
	private AuthorisationPredicate authorisationPredicate;

	private final Map<Object,Map<String,Object>> sessionHolder = new HashMap<>();

	private Boolean anonymous = false;
	private ScopedRepo sessionRepo;
	private Boolean orbisAuthEnabled = false;

	public void setAllowAnonymous(Boolean allow) {
		this.anonymous  = allow;
	}

	/*private ILicenseUtils l;

	public ILicenseUtils getL() {
		return l;
	}

	public void setL(ILicenseUtils l) {
		this.l = l;
	}*/

	/* (non-Javadoc)
         * @see org.saiku.web.service.ISessionService#setAuthenticationManager(org.springframework.security.authentication.AuthenticationManager)
         */
	public void setAuthenticationManager(AuthenticationManager auth) {
		this.authenticationManager = auth;
	}

	public void setAuthorisationPredicate(AuthorisationPredicate authorisationPredicate)
	{
		this.authorisationPredicate = authorisationPredicate;
	}

	/* (non-Javadoc)
	 * @see org.saiku.web.service.ISessionService#login(javax.servlet.http.HttpServletRequest, java.lang.String, java.lang.String)
	 */
	/**modify the login for getting rid of license validate 2019-03-29*/
	public Map<String, Object> login(HttpServletRequest req, String username, String password ) throws LicenseException {
	//	Object sl = null;
	//	String notice = null;
		HttpSession session = ((HttpServletRequest)req).getSession(true);
		session.getId();
		sessionRepo.setSession(session);
//		try {
//			sl = l.getLicense();
//		} catch (Exception e) {
//			log.debug("Could not process license", e);
//			throw new LicenseException("Error fetching license. Get a free license from http://licensing.meteorite.bi. You can upload it at /upload.html");
//		}

//		if (sl != null) {

//			try {
//				l.validateLicense();
//			} catch (RepositoryException | IOException | ClassNotFoundException e) {
//				log.debug("Repository Exception, couldn't get license", e);
//				throw new LicenseException("Error fetching license. Please check your logs.");
//			}

			if (authenticationManager != null) {
			    authenticate(req, username, password);
			}
			if (SecurityContextHolder.getContext() != null
			    && SecurityContextHolder.getContext().getAuthentication() != null) {
			    Authentication auth = SecurityContextHolder.getContext().getAuthentication();

			    if (authorisationPredicate.isAuthorised(auth)) {
			        Object p = auth.getPrincipal();
			        createSession(auth, username, password);
			        return sessionHolder.get(p);
			    } else {
			        log.info(username + " failed authorisation. Rejecting login");
			        throw new RuntimeException("Authorisation failed for: " + username);
			    }
			}
			return new HashMap<>();
	}
	
	/** The old login validation , have to validate license information
	public Map<String, Object> login(HttpServletRequest req, String username, String password ) throws LicenseException {
		Object sl = null;
		String notice = null;
		HttpSession session = ((HttpServletRequest)req).getSession(true);
		session.getId();
		sessionRepo.setSession(session);
		try {
			sl = l.getLicense();
		} catch (Exception e) {
			log.debug("Could not process license", e);
			throw new LicenseException("Error fetching license. Get a free license from http://licensing.meteorite.bi. You can upload it at /upload.html");
		}

		if (sl != null) {

			try {
				l.validateLicense();
			} catch (RepositoryException | IOException | ClassNotFoundException e) {
				log.debug("Repository Exception, couldn't get license", e);
				throw new LicenseException("Error fetching license. Please check your logs.");
			}

			try {
				if (l.getLicense() instanceof SaikuLicense2) {

                    if (authenticationManager != null) {
                        authenticate(req, username, password);
                    }
                    if (SecurityContextHolder.getContext() != null
                        && SecurityContextHolder.getContext().getAuthentication() != null) {
                        Authentication auth = SecurityContextHolder.getContext().getAuthentication();

                        if (authorisationPredicate.isAuthorised(auth)) {
                            Object p = auth.getPrincipal();
                            createSession(auth, username, password);
                            return sessionHolder.get(p);
                        } else {
                            log.info(username + " failed authorisation. Rejecting login");
                            throw new RuntimeException("Authorisation failed for: " + username);
                        }
                    }
                    return new HashMap<>();
                }
			} catch (IOException | ClassNotFoundException | RepositoryException e) {
				log.debug("Repository Exception, couldn't get license", e);
				throw new LicenseException("Error fetching license. Please check your logs.");
			}
		}
		return null;
	}
*/
	private void createSession(Authentication auth, String username, String password) {

		if (auth ==  null || !auth.isAuthenticated()) {
			return;
		}
		
		boolean isAnonymousUser = (auth instanceof AnonymousAuthenticationToken);		
		Object p = auth.getPrincipal();
		String authUser = getUsername(p);
		boolean isAnonymous = (isAnonymousUser || StringUtils.equals("anonymousUser", authUser));
		boolean isAnonOk = (!isAnonymous || (isAnonymous && anonymous));
			
		if (isAnonOk && auth.isAuthenticated() && p != null && !sessionHolder.containsKey(p)) {
			Map<String, Object> session = new HashMap<>();
			
			if (isAnonymous) {
				log.debug("Creating Session for Anonymous User");
			}
			
			if (StringUtils.isNotBlank(username)) {
				session.put("username", username);
			} else {
				session.put("username", authUser);
			}
			if (StringUtils.isNotBlank(password)) {
				session.put("password", password);		
			}
			session.put("sessionid", UUID.randomUUID().toString());
			session.put("authid", RequestContextHolder.currentRequestAttributes().getSessionId());
			List<String> roles = new ArrayList<>();
			for (GrantedAuthority ga : SecurityContextHolder.getContext().getAuthentication().getAuthorities()) {
				roles.add(ga.getAuthority());
			}
			session.put("roles", roles);
			
			sessionHolder.put(p, session);
		}

	}

	private String getUsername(Object p) {
		
		if (p instanceof UserDetails) {
			  return ((UserDetails)p).getUsername();
		} 
		return p.toString();
	}

	/* (non-Javadoc)
	 * @see org.saiku.web.service.ISessionService#logout(javax.servlet.http.HttpServletRequest)
	 */
	public void logout(HttpServletRequest req) {
		if (SecurityContextHolder.getContext() != null && SecurityContextHolder.getContext().getAuthentication() != null) {
			Object p = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
			if (sessionHolder.containsKey(p)) {
				sessionHolder.remove(p);
			}
		}

		SecurityContextHolder.getContext().setAuthentication(null);
		SecurityContextHolder.clearContext();

		HttpSession session = req.getSession(false);

		if (session != null && !orbisAuthEnabled) { // Just invalidate if not under orbis authentication workflow
			session.invalidate();
		}
	}

	/* (non-Javadoc)
	 * @see org.saiku.web.service.ISessionService#authenticate(javax.servlet.http.HttpServletRequest, java.lang.String, java.lang.String)
	 */
	public void authenticate(HttpServletRequest req, String username, String password) {
		try {
			UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);
			token.setDetails(new WebAuthenticationDetails(req));
			Authentication authentication = this.authenticationManager.authenticate(token);
			log.debug("Logging in with [{}]", authentication.getPrincipal());
			SecurityContextHolder.getContext().setAuthentication(authentication);
		}
		catch (BadCredentialsException bd) {
			throw new RuntimeException("Authentication failed for: " + username, bd);
		}

	}

	/* (non-Javadoc)
	 * @see org.saiku.web.service.ISessionService#getSession(javax.servlet.http.HttpServletRequest)
	 */
	public Map<String,Object> getSession() {
		if (SecurityContextHolder.getContext() != null && SecurityContextHolder.getContext().getAuthentication() != null) {			
			Authentication auth = SecurityContextHolder.getContext().getAuthentication();
			Object p = auth.getPrincipal();

		  if (sessionHolder.containsKey(p)) {
			  Map<String, Object> r = new HashMap<>();
			  r.putAll(sessionHolder.get(p));
			  r.remove("password");

			  if (!r.containsKey("sessionid")) {
			    r.put("sessionid", UUID.randomUUID().toString());
			  }

			  return r;
		  }
		}

		return new HashMap<>();
	}
	
	public Map<String,Object> getAllSessionObjects() {
		if (SecurityContextHolder.getContext() != null && SecurityContextHolder.getContext().getAuthentication() != null) {			
			Authentication auth = SecurityContextHolder.getContext().getAuthentication();
			Object p = auth.getPrincipal();
			//createSession(auth, null, null);
			if (sessionHolder.containsKey(p)) {
				Map<String,Object> r = new HashMap<>();
				r.putAll(sessionHolder.get(p)); 
				return r;
			}

		}
		return new HashMap<>();
	}

  public void clearSessions(HttpServletRequest req, String username, String password) throws Exception {
	if (authenticationManager != null) {
	  authenticate(req, username, password);
	}
	if (SecurityContextHolder.getContext() != null && SecurityContextHolder.getContext().getAuthentication() != null) {
	  Authentication auth = SecurityContextHolder.getContext().getAuthentication();
	  Object p = auth.getPrincipal();
	  if (sessionHolder.containsKey(p)) {
		sessionHolder.remove(p);
	  }
	}


  }


	public void setSessionRepo(org.saiku.repository.ScopedRepo sessionRepo) {
		this.sessionRepo = sessionRepo;
	}

	public Boolean isOrbisAuthEnabled() {
		return orbisAuthEnabled;
	}

	public void setOrbisAuthEnabled(Boolean orbisAuthEnabled) {
		this.orbisAuthEnabled = orbisAuthEnabled;
	}
}

 

  

 

完整的saiku-beans.xml

 

<?xml version="1.0" encoding="UTF-8" ?>

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

    <context:property-placeholder
            location="/WEB-INF/saiku-beans.properties"
            ignore-resource-not-found="true"
            ignore-unresolvable="true"
            order ="0" />

    <context:property-placeholder
            location="file:///${ext.prop.dir}saiku-beans.properties"
            ignore-resource-not-found="true"
            ignore-unresolvable="true"
            order ="-1" />

    <bean id="sessionRegistry"
          class="org.springframework.security.core.session.SessionRegistryImpl" />

    <!--	<bean id="classpathDsManager"
            class="org.saiku.service.datasource.ClassPathResourceDatasourceManager">
            <property name="path" value="res:saiku-datasources" />
        </bean>-->
    <bean id="repositoryDsManager" class="org.saiku.service.datasource.RepositoryDatasourceManager" init-method="load" destroy-method="unload">
        <!--aop:scoped-proxy/-->

        <property name="userService" ref="userServiceBean"/>
        <property name="configurationpath" value="${repoconfig}"/>
        <property name="datadir" value="${repodata}"/>
        <property name="foodmartdir" value="${foodmartrepo}"/>
        <property name="foodmartschema" value="${foodmartschema}"/>
        <property name="foodmarturl" value="${foodmarturl}"/>
        <property name="earthquakeDir" value="${earthquakerepo}"/>
        <property name="earthquakeSchema" value="${earthquakeschema}"/>
        <property name="earthquakeUrl" value="${earthquakeurl}"/>
        <property name="repoPasswordProvider" ref ="repoPasswordProviderBean"/>
        <property name="defaultRole" value="${default.role}"/>
        <property name="externalPropertiesFile" value="${external.properties.file}"/>
        <!-- If you change the repoPassword set this property for at least 1 restart to update the old repo password-->
        <!--<property name="oldRepoPassword" value="sa!kuanalyt!cs"/>-->
        <property name="type" value="${repo.type}"/>
        <property name="sessionRegistry" ref="sessionRepo"/>
        <property name="workspaces" value="${workspaces}"/>
        <!-- MarkLogic specific properties -->
        <property name="host" value="${repo.host}"/>
        <property name="port" value="${repo.port}"/>
        <property name="username" value="${repo.username}"/>
        <property name="password" value="${repo.password}"/>
        <property name="database" value="${repo.database}"/>
    </bean>

    <bean id="repoPasswordProviderBean" class="org.saiku.service.util.security.authentication.SimplePasswordProvider">
        <constructor-arg index="0" value="${webdav.password}"/>
    </bean>


   <!--  <bean id="licenseUtilsBean" class="org.saiku.service.license.LicenseUtils" init-method="init">
        <property name="repositoryDatasourceManager" ref="repositoryDsManager" />
    </bean>
 -->

    <bean id="h2database" class="org.saiku.database.Database" init-method="init">
        <property name="datasourceManager" ref="repositoryDsManager"/>
    </bean>
	

    <bean id="authorisationPredicate" class="org.saiku.service.util.security.authorisation.MustBeAuthenticatedAuthorisation"/>

    <bean id="sessionRepo" class="org.saiku.repository.ScopedRepo" scope="session">
        <aop:scoped-proxy/>
    </bean>

    <bean id="sessionService" class="org.saiku.web.service.SessionService">
        <property name="authenticationManager" ref="authenticationManager"/>
       <property name="sessionRepo" ref="sessionRepo"/>
        <property name="authorisationPredicate" ref="authorisationPredicate"/>
       <!--  <property name="l" ref="licenseUtilsBean"/> -->
        <property name="orbisAuthEnabled" value="${orbis.auth.enabled}"/> 
        <!-- <property name="allowAnonymous" value="true" />   -->
    </bean>

    <bean id="securityContextPersistenceFilter" class="org.springframework.security.web.context.SecurityContextPersistenceFilter"/>
    <bean class="org.saiku.datasources.connection.MondrianVFS" init-method="init" id="mondrianVFS">
        <property name="datasourceManager" ref="repositoryDsManager"/>
    </bean>
    <bean id="connectionManager" class="org.saiku.web.core.SecurityAwareConnectionManager" init-method="init"
          destroy-method="destroy" depends-on="mondrianVFS">
        <property name="userService" ref="userServiceBean"/>
        <property name="dataSourceManager" ref="repositoryDsManager"/>
        <property name="sessionService" ref="sessionService"/>
    </bean>

    <bean id="datasourceServiceBean" class="org.saiku.service.datasource.DatasourceService">
        <property name="connectionManager" ref="connectionManager"/>
    </bean>

    <bean id="userDaoDataSource"
          class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${userdao.driverclass}" />
        <property name="url"
                  value="${userdao.url}"/>
        <property name="username" value="${userdao.username}" />
        <property name="password" value="${userdao.password}" />
    </bean>

    <bean id="userDAO" class="org.saiku.database.JdbcUserDAO">
        <property name="dataSource" ref="userDaoDataSource" />
    </bean>

    <bean id="userServiceBean" class="org.saiku.service.user.UserService">
        <property name="jdbcUserDAO" ref="userDAO"/>
        <property name="datasourceService" ref="datasourceServiceBean"/>
        <property name="iDatasourceManager" ref="repositoryDsManager"/>
        <property name="adminRoles">
            <list>
                <value>ROLE_ADMIN</value>
            </list>
        </property>
        <property name="sessionService" ref="sessionService"/>
    </bean>
    <bean id="logwriterbean" class="org.saiku.log.LogExtractor">
        <property name="logdirectory" value="${logdir}"/>
    </bean>
    <bean id="adminBean" class="org.saiku.web.rest.resources.AdminResource">
        <property name="userService" ref="userServiceBean"/>
        <property name="datasourceService" ref="datasourceServiceBean"/>
        <property name="olapDiscoverService" ref="olapDiscoverServiceBean"/>
        <property name="repositoryDatasourceManager" ref="repositoryDsManager"/>
        <property name="logExtractor" ref="logwriterbean"/>
    </bean>

    <bean id="olapDiscoverServiceBean" class="org.saiku.service.olap.OlapDiscoverService">
        <property name="datasourceService" ref="datasourceServiceBean"/>
    </bean>

    <bean id="olapQueryBean" scope="session" class="org.saiku.service.olap.OlapQueryService" destroy-method="destroy">
        <property name="olapDiscoverService" ref="olapDiscoverServiceBean"/>
    </bean>


    <!--<bean id="datasourceResourceBean" class="org.saiku.web.rest.resources.DataSourceResource">
        <property name="datasourceService" ref="datasourceServiceBean"/>
        <property name="userService" ref="userServiceBean"/>
    </bean>-->

    <bean id="olapDiscoverBean" scope="session"
          class="org.saiku.web.rest.resources.OlapDiscoverResource">
        <property name="olapDiscoverService" ref="olapDiscoverServiceBean"/>
    </bean>


    <bean id="queryResource" scope="request"
          class="org.saiku.web.rest.resources.QueryResource">
        <property name="olapQueryService" ref="olapQueryBean"/>
        <property name="olapDiscoverService" ref="olapDiscoverServiceBean"/>
        <property name="repository" ref="repository2bean"/>
    </bean>

    <bean id="thinQueryBean" scope="session"
          class="org.saiku.service.olap.ThinQueryService">
        <property name="olapDiscoverService" ref="olapDiscoverServiceBean"/>
    </bean>

    <bean id="platformBean" class="org.saiku.service.PlatformUtilsService">
        <property name="path" value="${pluginpath}"/>
    </bean>

    <bean id="infoResource" class="org.saiku.web.rest.resources.InfoResource">
        <property name="platformUtilsService" ref="platformBean"/>
    </bean>

    <bean id="queryResource2" scope="request"
          class="org.saiku.web.rest.resources.Query2Resource">
        <property name="thinQueryService" ref="thinQueryBean"/>
        <property name="repository" ref="repository2bean"/>
    </bean>

    <bean id="sessionResource" class="org.saiku.web.rest.resources.SessionResource">
        <property name="sessionService" ref="sessionService"/>
        <property name="userService" ref="userServiceBean"/>

    </bean>

    <bean id="repository2bean" scope="request"
          class="org.saiku.web.rest.resources.BasicRepositoryResource2">
        <property name="sessionService" ref="sessionService"/>
        <property name="datasourceService" ref="datasourceServiceBean"/>
    </bean>


    <bean id="filterRepositoryBean" scope="session"
          class="org.saiku.web.rest.resources.FilterRepositoryResource">
        <property name="olapQueryService" ref="olapQueryBean"/>
        <property name="sessionService" ref="sessionService"/>
    </bean>


    <bean id="exporterBean" scope="request"
          class="org.saiku.web.rest.resources.ExporterResource">
        <property name="repository" ref="repository2bean"/>
        <property name="query2Resource" ref="queryResource2"/>
    </bean>


   <!--  <bean id="licenseUtils" class="org.saiku.service.license.LicenseUtils">
        <property name="repositoryDatasourceManager" ref="repositoryDsManager"/>
    </bean> -->
   <!--  <bean id="licenseBean" class="org.saiku.web.rest.resources.License">
        <property name="databaseManager" ref="h2database"/>
        <property name="licenseUtils" ref="licenseUtils"/>
        <property name="userService" ref="userServiceBean"/>
    </bean> -->

    <bean id="statsBean" class="org.saiku.web.rest.resources.StatisticsResource"/>

    <bean id="startupBean" class="org.saiku.web.rest.util.StartupResource" init-method="init"/>


</beans>

 

  

 

完整的plugin.spring.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ws="http://jax-ws.dev.java.net/spring/core"
	xmlns:wss="http://jax-ws.dev.java.net/spring/servlet"
	xmlns:pen="http://www.pentaho.com/schema/pentaho-system"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd
                           http://jax-ws.dev.java.net/spring/core http://jax-ws.dev.java.net/spring/core.xsd
                           http://jax-ws.dev.java.net/spring/servlet http://jax-ws.dev.java.net/spring/servlet.xsd
                           http://www.pentaho.com/schema/pentaho-system http://www.pentaho.com/schema/pentaho-system.xsd">

  <context:annotation-config />

  <!-- uncomment for direct jersey services -->
  <!-- bean id="jaxrsPluginServlet" class="org.pentaho.plugin.j2ee.JAXRSPluginServlet" /-->
  
  <context:annotation-config />

  <bean id="api" class="org.saiku.plugin.resources.ExtendedJAXRSPluginServlet"/>

<bean id="contentAccessFactory" scope="prototype" class="pt.webdetails.cpf.PentahoPluginEnvironment" />

	<bean id="userServiceBean" class="org.saiku.service.user.UserService">
		<property name="datasourceService" ref="datasourceServiceBean"/>
		<property name="iDatasourceManager" ref="pentahoDsManager"/>
		<property name="adminRoles">
			<list>
				<value>Administrator</value>
			</list>
		</property>
		<property name="sessionService" ref="sessionService"/>
	</bean>

	<bean id="pentahoDsManager" class="org.saiku.plugin.PentahoDatasourceManager">
		<property name="datasourceResolverClass" value="org.saiku.plugin.PentahoDataSourceResolver" />
		<!-- <property name="dynamicSchemaProcessor" value="mondrian.i18n.LocalizingDynamicSchemaProcessor" /> -->
	</bean>

	<bean id="connectionManager" class="org.saiku.plugin.PentahoSecurityAwareConnectionManager">
		<property name="dataSourceManager" ref="pentahoDsManager" />
		<property name="userAware" value="false" />
		<property name="userService" ref="userServiceBean" />
		<property name="connectionPooling" value="true" />
	</bean>

	<bean id="datasourceServiceBean" class="org.saiku.service.datasource.DatasourceService">
		<property name="connectionManager" ref="connectionManager" />
	</bean>

	<bean id="olapDiscoverServiceBean" class="org.saiku.service.olap.OlapDiscoverService">
		<property name="datasourceService" ref="datasourceServiceBean" />
	</bean>

	<bean id="olapQueryBean" class="org.saiku.service.olap.OlapQueryService">
		<property name="olapDiscoverService" ref="olapDiscoverServiceBean" />
	</bean>

	<bean id="thinQueryBean" class="org.saiku.service.olap.ThinQueryService">
		<property name="olapDiscoverService" ref="olapDiscoverServiceBean" />
	</bean>


	<bean id="olapDiscoverBean" class="org.saiku.plugin.resources.PentahoDiscoverResource">
		<property name="olapDiscoverService" ref="olapDiscoverServiceBean" />
	</bean>


	<bean id="queryResource" class="org.saiku.plugin.resources.PentahoQueryResource">
		<property name="thinQueryService" ref="thinQueryBean" />
        <property name="repository" ref="repositoryBean2"/>
		<property name="userService" ref="userServiceBean"/>
	</bean>
	
	<bean id="sessionService" class="org.saiku.plugin.PentahoSessionServiceSeven">
		<property name="userService" ref="userServiceBean"/>
	<!-- 	<property name="l" ref="licenseUtilsBeanPlugin"/> -->
	</bean>

    <bean id="sessionResource" class="org.saiku.plugin.resources.PentahoSessionResource">
    		<property name="sessionService" ref="sessionService" />
	</bean>

  	<bean id="repositoryBean2" class="org.saiku.plugin.resources.PentahoRepositoryResource2">
		<property name="userService" ref="userServiceBean"/>
	</bean>


  	 <bean id="filterRepositoryBean" class="org.saiku.plugin.resources.PentahoFilterRepositoryResource">
		<property name="olapQueryService" ref="olapQueryBean" />
		<property name="sessionService" ref="sessionService" />
		<property name="path" value="saiku-repository"/>
	</bean>
	
	<bean id="pluginResource" class="org.saiku.plugin.resources.PluginResource" />
	
	<bean id="exporterBean" class="org.saiku.plugin.resources.PentahoExporterResource">
   		<property name="repository" ref="repositoryBean2" />
		<property name="query2Resource" ref="queryResource" />
	</bean>
	
	
  <bean id="saiku.editor" class="org.pentaho.platform.plugin.services.webservices.content.PluginFileContentGenerator" scope="prototype">
    <property name="mimeType" value="text/html" />
    <property name="relativeFilePath" value="ui/forward.html" />
    <property name="pluginId" value="saiku" />
  </bean> 

	
    <bean id="saiku.run" class="org.pentaho.platform.plugin.services.webservices.content.PluginFileContentGenerator" scope="prototype">
        <property name="mimeType" value="text/html" />
        <property name="relativeFilePath" value="ui/forward.html" />
        <property name="pluginId" value="saiku" />
    </bean>
    
    <bean id="saiku" class="org.pentaho.platform.plugin.services.webservices.content.PluginFileContentGenerator" scope="prototype">
        <property name="mimeType" value="text/html" />
        <property name="relativeFilePath" value="ui/forward.html" />
        <property name="pluginId" value="saiku" />
    </bean>

    
  <bean class="org.pentaho.platform.engine.core.solution.ContentInfo">
	<property name="mimeType" value="text/xml"/>	
	<property name="extension" value=".saiku"/>	
	<property name="canImport" value="true"/>
	<property name="canExport" value="true"/>		
	<pen:publish as-type="INTERFACES"/>
  </bean>



	<bean id="repositoryDsManager" class="org.saiku.plugin.PentahoRepositoryResource"/>

<!-- 	<bean id="licenseUtilsBeanPlugin" class="org.saiku.plugin.LicenseUtils" init-method="init">
		<property name="repositoryDatasourceManager" ref="repositoryDsManager"/>
	</bean> -->

<!-- 	<bean id="licenseBean" class="org.saiku.plugin.resources.PentahoLicenseResource">
		<property name="licenseUtils" ref="licenseUtilsBeanPlugin"/>
		<property name="userService" ref="userServiceBean"/>
	</bean> -->


	<bean id="startupBean" scope="singleton" class="org.saiku.web.rest.util.StartupResource"  init-method="init"  />
	
</beans>

 

  

 

=================二次更新= (第一次通过操作以上步骤确实能正常打包编译saiku然后启动 也不需要上传license验证信息,但是我最近重新编译源码的时候发现license相关报错了。。)=====end=======

 

 

 

云祺备份软件,云祺容灾备份系统,虚拟机备份,数据库备份,文件备份,实时备份,勒索软件,美国,图书馆
  • 标签:
  • 容灾备份

您可能感兴趣的新闻 换一批

现在下载,可享30天免费试用

立即下载