終於仍是走到了這一步,老早就在說要去掉這個License驗證了,一直沒作由於忙着別的。可是由於這個License還和可定義的用戶數相關,限制了咱們的使用,因此這裏從saiku源碼中作更改,去掉License驗證。html
須要更改的代碼文件以下:前端
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
>>>後臺代碼更改 java
1.更改SesseionService.java類中的 login方法,將有關於Licence驗證的代碼註釋掉便可。改完後的login方法以下:web
* @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方法以下:spring
@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(); }
>>>前端代碼更改sql
3. 去掉Saiku升級相關提示,Upgrade.js文件中將render方法內容註釋掉,詳情以下:express
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方法,使其不調用Licenseapache
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; },
作出以上更改後,從新打包編譯源碼便可。json
再次啓動編譯好的saiku,就會發現不須要上傳License文件啦!可直接登陸saiku進行使用~api
並且還有個地方能夠驗證你是否已經成功取得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=======