Bạn đang xem bài viết Hướng Dẫn Tạo Bản Quyền (License Product) Bảo Mật Ứng Dụng. được cập nhật mới nhất trên website Rafs.edu.vn. Hy vọng những thông tin mà chúng tôi đã chia sẻ là hữu ích với bạn. Nếu nội dung hay, ý nghĩa bạn hãy chia sẻ với bạn bè của mình và luôn theo dõi, ủng hộ chúng tôi để cập nhật những thông tin mới nhất.
Hôm nay, mình xin hướng dẫn các bạn cách tạo License cho ứng dụng. Sau khi, tạo ứng dụng xong, nếu các bạn muốn phân phối ứng dụng của mình theo License product.
Ở bài viết này, mình hướng dẫn các bạn thuật toán cơ bản để bảo mật ứng dụng.
1. Đầu tiên, mình lấy serial number của HDD. Vì serial number HDD là duy nhất, nên ứng dụng mình cài vào máy tính nào thì chỉ sử dụng được một máy, cài đặt vào ổ cứng khác thì ứng dụng sẽ không hoạt động.
2. Tạo khóa token (chuỗi bảo mật).
3. Sử dụng thuật toán SHA1, serial number HDD với token của mình. Bạn có thể sử dụng thuật toán MD5, hay 1 thuật toán mã hóa bất kỳ.
Giao diện ứng dụng:
– Để xem Serial number HDD bạn có thể sử dụng câu lệnh MS-DOS
wmic diskdrive get serialnumber
– Import thư viện
Imports System.ComponentModel Imports System.Text Imports System.Security.Cryptography Imports System.Management Imports System.Data Imports System.Data.SqlClient Public Function GetDriveSerialNumber() As String Dim hdd As New ManagementObjectSearcher("select * from Win32_DiskDrive") Dim hd As ManagementObject For Each hd In hdd.Get() HDD_Serial = hd("SerialNumber") Next Return HDD_Serial End Function– Tiếp tục hàm mã hóa SHA1,
Public Function SHA1(ByVal number As String) As String Dim ASCIIENC As New ASCIIEncoding Dim strreturn As String strreturn = vbNullString Dim bytesourcetxt() As Byte = ASCIIENC.GetBytes(number) Dim SHA1Hash As New SHA1CryptoServiceProvider Dim bytehash() As Byte = SHA1Hash.ComputeHash(bytesourcetxt) For Each b As Byte In bytehash strreturn &= b.ToString("X8") Next Return strreturn End Function– Viết hàm tạo key license cho software
Dim key As String key = SHA1(serialHDD.Trim & token) chúng tôi = key End Sub
– Viết hàm đăng ký license cho ứng dụng
Dim keyLicense As String = txtRegister.Text Dim key As String key = SHA1(serialHDD.Trim & token) If (keyLicense = key) Then saveData(“update license set licensekey='” & keyLicense & “‘ where id=1”) Me.Hide() Dim frm As New XtraForm1 frm.ShowDialog() Else MessageBox.Show(“Key is not Valid!”, “ERROR!”) End If
End Sub
– Viết hàm kiểm tra khi chạy ứng dụng, ứng dụng đã được đăng ký hay chưa
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load chúng tôi = GetDriveSerialNumber().Trim() 'get serial key from data Dim keyData As String keyData = getData() 'get key from hdd serial with token sha1 Dim key As String key = SHA1(serialHDD.Trim & token) If keyData = key Then Me.Hide() Dim frm As New XtraForm1 frm.ShowDialog() End If End SubCám ơn các bạn đã xem bài viết. Hãy like and share giúp mình nha các bạn.
Các bạn có thể Đăng ký kênh Youtube của mình ở góc phải bên trên màn hình.
Mọi thắc mắc về bài viết các bạn có thể hỏi ở http://hoidap.laptrinhvb.net để được support.
Download source
Tạo Một Ứng Dụng Login Đơn Giản Và Bảo Mật Với Java Servlet Filter
Bảo mật (Security) là môt khía cạnh quan trọng của một ứng dụng có sự vận chuyển các dữ liệu quan trọng trên Internet.
Authentication (Xác thực)
Xác thực là quá trình mà quyền truy cập (access privileges) của người dùng được xác minh trước khi họ vào khu vực được bảo vệ của Website. Có hai cách tiếp cận xác thực chính: xác thực cơ bản và xác thực dựa trên biểu mẫu (Form-based authentication).
Basic Authentication (Xác thực cơ bản).
Với xác thực cơ bản, người dùng có thể truy cập mọi trang (page) hoàn toàn bình thường, với các trang yêu cầu bảo mật, một cửa sổ sẽ hiển thị để người dùng nhập vào username/password của họ. Thông tin username/password sẽ được gói lại gửi kèm theo yêu cầu (request) đến Server.
Khi người dùng nhập một đường dẫn trên trình duyệt, và nhấn Enter để yêu cầu một trang (page). Một thông tin “User Agent” được tạo ra và được gửi kèm theo yêu cầu. Thông thường thông tin này bao gồm thông tin trình duyệt của người dùng, thông tin hệ điều hành. Trong trường hợp xác thực cơ bản (basic authentication) thông tin username/password được gói bên trong “User Agent”.
Trong bài học này tôi không đề cập chi tiết về xác thực cơ bản.
Form-based Authentication (Xác thực dựa trên biểu mẫu)
Hầu hết các Website sử dụng hình thức xác thực dựa trên biểu mẫu (Form-based Authentication). Website cho phép người dùng truy cập mọi trang thông thường mà không yêu cầu mật khẩu. Tuy nhiên nếu người dùng truy cập vào một trang được bảo vệ, nó sẽ chuyển hướng tới một trang đăng nhập.
Trong bài học này, tôi sẽ đề cập chi tiết về cách sử dụng một Servlet Filter để bảo mật ứng dụng Java Web.
2- Khái niệm về Role và Principal
Trong bảo mật, có 2 khái niệm quan trọng là Principal và Role.
Role (Vai trò) là một tập hợp các quyền (permission) đối với một ứng dụng.
Để đơn giản tôi đưa ra một ví dụ, ứng dụng ABC có 2 vai trò “EMPLOYEE” (nhân viên) và “MANAGER” (Người quản lý).
Vai trò “EMPLOYEE” được phép sử dụng các chức năng bán hàng, và chức năng tạo mới thông tin khách hàng.
Vai trò “MANAGER” được phép sử dụng các chức năng quản lý nhân viên, và xem các báo cáo doanh thu.
Principal có thể tạm hiểu là một “Chủ thể” sau khi đã đăng nhập vào một hệ thống, họ có quyền làm điều gì đó trong hệ thống. Một “Chủ thể” có thể có một hoặc nhiều vai trò. Điều này phụ thuộc vào sự phân quyền của ứng dụng cho mỗi tài khoản người dùng khác nhau.
Trong ứng dụng Java Servlet, một Servlet Filter đặc biệt được sử dụng để xử lý bảo mật, nó thường được gọi là Security Filter.
Khi người dùng truy cập vào một trang (page) được bảo vệ, Security Filter sẽ kiểm tra, nếu người dùng chưa đăng nhập, yêu cầu của người dùng sẽ bị chuyển hướng (redirect) sang trang đăng nhập.
Nếu người dùng đã đăng nhập thành công, một đối tượng Principal được tạo ra, nó mang các thông tin của người dùng, bao gồm cả các vai trò.
Nếu người dùng đã đăng nhập thành công trước đó, và truy cập vào một trang (page) được bảo vệ. Security Filter sẽ kiểm tra các vai trò của người dùng có phù hợp để truy cập vào trang này hay không. Nếu không hợp lệ, nó sẽ hiển thị cho người dùng một trang thông báo truy cập bị cấm (Access Denied).
Đây là cấu trúc của ứng dụng mà chúng ta sẽ thực hiện:
Ứng dụng bao gồm 2 vai trò (Role) là EMPLOYEE và MANAGER.
Vai trò EMPLOYEE cho phép truy cập 2 trang /userInfo và /employeeTask
Vai trò MANAGER cho phép truy cập 2 trang /userInfo và /managerTask.
Tất cả các trang khác trong ứng dụng không yêu cầu phải đăng nhập.
Có 2 người dùng (user) là employee1 và manager1.
Người dùng employee1 được gán vai trò EMPLOYEE
Người dùng manager1 được gán cả 2 vai trò MANAGER và EMPLOYEE.
Người dùng có thể truy cập tất cả các trang không được bảo hộ một cách bình thường. Tuy nhiên nếu người dùng truy cập vào một trang ABC được bảo hộ, nó sẽ chuyển hướng (redirect) tới trang đăng nhập. Người dùng đăng nhập thành công, lúc này sẽ có 2 tình huống xẩy ra:
Ứng dụng sẽ chuyển hướng về trang ABC sau khi đăng nhập thành công, nếu userName có vai trò phù hợp.
Ứng dụng sẽ hiển thị thông báo truy cập bị từ chối (Access Denied) nếu userName có vai trò không phù hợp.
Lớp UserAccount đại diện cho người dùng của ứng dụng.
package org.o7planning.securitywebapp.bean; import java.util.ArrayList; import java.util.List; public class UserAccount { public static final String GENDER_MALE = "M"; public static final String GENDER_FEMALE = "F"; private String userName; private String gender; private String password; public UserAccount() { } public UserAccount(String userName, String password, String gender, String... roles) { this.userName = userName; this.password = password; this.gender = gender; if (roles != null) { for (String r : roles) { this.roles.add(r); } } } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } return roles; } this.roles = roles; } }Lớp DataDAO được sử dụng để truy vấn dữ liệu trong Database (Mô phỏng).
package org.o7planning.securitywebapp.utils; import java.util.HashMap; import java.util.Map; import org.o7planning.securitywebapp.bean.UserAccount; import org.o7planning.securitywebapp.config.SecurityConfig; public class DataDAO { static { initUsers(); } private static void initUsers() { UserAccount emp = new UserAccount("employee1", "123", UserAccount.GENDER_MALE, SecurityConfig.ROLE_EMPLOYEE); UserAccount mng = new UserAccount("manager1", "123", UserAccount.GENDER_MALE, SecurityConfig.ROLE_EMPLOYEE, SecurityConfig.ROLE_MANAGER); mapUsers.put(emp.getUserName(), emp); mapUsers.put(mng.getUserName(), mng); } public static UserAccount findUser(String userName, String password) { UserAccount u = mapUsers.get(userName); if (u != null && u.getPassword().equals(password)) { return u; } return null; } }7- SecurityConfig & SecurityUtils
Lớp SecurityConfig giúp cấu hình các vai trò và các chức năng (các trang) được phép truy cập ứng với vai trò đó.
package org.o7planning.securitywebapp.config; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; public class SecurityConfig { public static final String ROLE_MANAGER = "MANAGER"; public static final String ROLE_EMPLOYEE = "EMPLOYEE"; static { init(); } private static void init() { urlPatterns1.add("/userInfo"); urlPatterns1.add("/employeeTask"); mapConfig.put(ROLE_EMPLOYEE, urlPatterns1); urlPatterns2.add("/userInfo"); urlPatterns2.add("/managerTask"); mapConfig.put(ROLE_MANAGER, urlPatterns2); } return mapConfig.keySet(); } return mapConfig.get(role); } }Lớp SecurityUtils là một lớp tiện ích, nó có các phương thức giúp kiểm tra một request (yêu cầu) có bắt buộc phải đăng nhập hay không, và request đó có phù hợp với vai trò của người dùng đã đăng nhập hay không.
package org.o7planning.securitywebapp.utils; import java.util.List; import java.util.Set; import javax.servlet.http.HttpServletRequest; import org.o7planning.securitywebapp.config.SecurityConfig; public class SecurityUtils { public static boolean isSecurityPage(HttpServletRequest request) { String urlPattern = UrlPatternUtils.getUrlPattern(request); for (String role : roles) { if (urlPatterns != null && urlPatterns.contains(urlPattern)) { return true; } } return false; } public static boolean hasPermission(HttpServletRequest request) { String urlPattern = UrlPatternUtils.getUrlPattern(request); for (String role : allRoles) { if (!request.isUserInRole(role)) { continue; } if (urlPatterns != null && urlPatterns.contains(urlPattern)) { return true; } } return false; } } package org.o7planning.securitywebapp.utils; import java.util.Collection; import java.util.Map; import javax.servlet.ServletContext; import javax.servlet.ServletRegistration; import javax.servlet.http.HttpServletRequest; public class UrlPatternUtils { private static boolean hasUrlPattern(ServletContext servletContext, String urlPattern) { for (String servletName : map.keySet()) { ServletRegistration sr = map.get(servletName); if (mappings.contains(urlPattern)) { return true; } } return false; } public static String getUrlPattern(HttpServletRequest request) { ServletContext servletContext = request.getServletContext(); String servletPath = request.getServletPath(); String pathInfo = request.getPathInfo(); String urlPattern = null; if (pathInfo != null) { urlPattern = servletPath + "/*"; return urlPattern; } urlPattern = servletPath; boolean has = hasUrlPattern(servletContext, urlPattern); if (has) { return urlPattern; } int i = servletPath.lastIndexOf('.'); if (i != -1) { String ext = servletPath.substring(i + 1); urlPattern = "*." + ext; has = hasUrlPattern(servletContext, urlPattern); if (has) { return urlPattern; } } return "/"; } }SecurityFilter là một Servlet Filter, nó làm nhiệm vụ kiểm tra các request trước khi cho phép truy cập vào các trang (page) được bảo hộ.
SecurityFilter đọc “các cấu hình bảo mật” đã được khai báo trong lớp SecurityConfig.
package org.o7planning.securitywebapp.filter; import java.io.IOException; import java.util.List; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.o7planning.securitywebapp.bean.UserAccount; import org.o7planning.securitywebapp.request.UserRoleRequestWrapper; import org.o7planning.securitywebapp.utils.AppUtils; import org.o7planning.securitywebapp.utils.SecurityUtils; @WebFilter("/*") public class SecurityFilter implements Filter { public SecurityFilter() { } @Override public void destroy() { } @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; String servletPath = request.getServletPath(); UserAccount loginedUser = AppUtils.getLoginedUser(request.getSession()); if (servletPath.equals("/login")) { chain.doFilter(request, response); return; } HttpServletRequest wrapRequest = request; if (loginedUser != null) { String userName = loginedUser.getUserName(); wrapRequest = new UserRoleRequestWrapper(userName, roles, request); } if (SecurityUtils.isSecurityPage(request)) { if (loginedUser == null) { String requestUri = request.getRequestURI(); int redirectId = AppUtils.storeRedirectAfterLoginUrl(request.getSession(), requestUri); response.sendRedirect(wrapRequest.getContextPath() + "/login?redirectId=" + redirectId); return; } boolean hasPermission = SecurityUtils.hasPermission(wrapRequest); if (!hasPermission) { RequestDispatcher dispatcher = request.getServletContext().getRequestDispatcher("/WEB-INF/views/accessDeniedView.jsp"); dispatcher.forward(request, response); return; } } chain.doFilter(wrapRequest, response); } @Override public void init(FilterConfig fConfig) throws ServletException { } }UserRoleRequestWrapper.java
package org.o7planning.securitywebapp.request; import java.security.Principal; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; /** * An extension for the HTTPServletRequest that overrides the getUserPrincipal() * and isUserInRole(). We supply these implementations here, where they are not * normally populated unless we are going through the facility provided by the * container. * If he user or roles are null on this wrapper, the parent request is consulted * to try to fetch what ever the container has set for us. This is intended to * be created and used by the UserRoleFilter. * * @author thein * */ public class UserRoleRequestWrapper extends HttpServletRequestWrapper { private String user; private HttpServletRequest realRequest; super(request); this.user = user; this.roles = roles; this.realRequest = request; } @Override public boolean isUserInRole(String role) { if (roles == null) { return this.realRequest.isUserInRole(role); } return roles.contains(role); } @Override public Principal getUserPrincipal() { if (this.user == null) { return realRequest.getUserPrincipal(); } return new Principal() { @Override public String getName() { return user; } }; } }9- Trang chủ, Login, Logout
package org.o7planning.securitywebapp.servlet; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet({ "/", "/index" }) public class HomeServlet extends HttpServlet { private static final long serialVersionUID = 1L; public HomeServlet() { super(); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RequestDispatcher dispatcher = this.getServletContext().getRequestDispatcher("/WEB-INF/views/homeView.jsp"); dispatcher.forward(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } package org.o7planning.securitywebapp.servlet; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.o7planning.securitywebapp.bean.UserAccount; import org.o7planning.securitywebapp.utils.AppUtils; import org.o7planning.securitywebapp.utils.DataDAO; @WebServlet("/login") public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; public LoginServlet() { super(); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RequestDispatcher dispatcher = this.getServletContext().getRequestDispatcher("/WEB-INF/views/loginView.jsp"); dispatcher.forward(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String userName = request.getParameter("userName"); String password = request.getParameter("password"); UserAccount userAccount = DataDAO.findUser(userName, password); if (userAccount == null) { String errorMessage = "Invalid userName or Password"; request.setAttribute("errorMessage", errorMessage); RequestDispatcher dispatcher = this.getServletContext().getRequestDispatcher("/WEB-INF/views/loginView.jsp"); dispatcher.forward(request, response); return; } AppUtils.storeLoginedUser(request.getSession(), userAccount); int redirectId = -1; try { redirectId = Integer.parseInt(request.getParameter("redirectId")); } catch (Exception e) { } String requestUri = AppUtils.getRedirectAfterLoginUrl(request.getSession(), redirectId); if (requestUri != null) { response.sendRedirect(requestUri); } else { response.sendRedirect(request.getContextPath() + "/userInfo"); } } } package org.o7planning.securitywebapp.utils; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpSession; import org.o7planning.securitywebapp.bean.UserAccount; public class AppUtils { private static int REDIRECT_ID = 0; public static void storeLoginedUser(HttpSession session, UserAccount loginedUser) { session.setAttribute("loginedUser", loginedUser); } public static UserAccount getLoginedUser(HttpSession session) { UserAccount loginedUser = (UserAccount) session.getAttribute("loginedUser"); return loginedUser; } public static int storeRedirectAfterLoginUrl(HttpSession session, String requestUri) { Integer id = uri_id_map.get(requestUri); if (id == null) { id = REDIRECT_ID++; uri_id_map.put(requestUri, id); id_uri_map.put(id, requestUri); return id; } return id; } public static String getRedirectAfterLoginUrl(HttpSession session, int redirectId) { String url = id_uri_map.get(redirectId); if (url != null) { return url; } return null; } } package org.o7planning.securitywebapp.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/logout") public class LogoutServlet extends HttpServlet { private static final long serialVersionUID = 1L; public LogoutServlet() { super(); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getSession().invalidate(); response.sendRedirect(request.getContextPath() + "/"); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } } package org.o7planning.securitywebapp.servlet; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/userInfo") public class UserInfoServlet extends HttpServlet { private static final long serialVersionUID = 1L; public UserInfoServlet() { super(); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RequestDispatcher dispatcher = this.getServletContext().getRequestDispatcher("/WEB-INF/views/userInfoView.jsp"); dispatcher.forward(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" Employee Task || Manager Task || User Info || Login || Logout /WEB-INF/views/homeView.jsp
/WEB-INF/views/loginView.jsp
manager1/123/WEB-INF/views/userInfoView.jsp
Chạy ứng dụng:
package org.o7planning.securitywebapp.servlet; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/employeeTask") public class EmployeeTaskServlet extends HttpServlet { private static final long serialVersionUID = 1L; public EmployeeTaskServlet() { super(); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RequestDispatcher dispatcher = this.getServletContext()// .getRequestDispatcher("/WEB-INF/views/employeeTaskView.jsp"); dispatcher.forward(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } package org.o7planning.securitywebapp.servlet; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/managerTask") public class ManagerTaskServlet extends HttpServlet { private static final long serialVersionUID = 1L; public ManagerTaskServlet() { super(); } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RequestDispatcher dispatcher = this.getServletContext()// .getRequestDispatcher("/WEB-INF/views/managerTaskView.jsp"); dispatcher.forward(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }/WEB-INF/views/employeeTaskView.jsp
Hello, This is a protected page!/WEB-INF/views/managerTaskView.jsp
Hello, This is a protected page!/WEB-INF/views/accessDenied.jsp
Chạy ứng dụng:
Chạy ứng dụng và đăng nhập với userName = “employee1”, đây là người dùng có vai trò “EMPLOYEE”.
Chạy ứng dụng và đăng nhập với userName = “manager1”, đây là người dùng có 2 vai trò “EMPLOYEE” và “MANAGER”.
Hướng Dẫn Tải Bộ Cài Đặt Microsoft Office 2010, 2013, 2022 Full (Khi Có Product Key Bản Quyền)
Microsoft cũng đã ngưng sản xuất Office Pro 2016 fullbox.
Muốn mua Office Pro chỉ có 2 cách: Mua Office ProPlus dạng OLP (tối thiểu 5 bộ) hoặc mua Office Home and Business 2016 + Access rời.
Lưu ý: Microsoft cấp phép Win và Office theo 3 cách: ESD, OEM và OLP.( ESD là Electronic Software Download)
Đối với Windows OEM thì chỉ có cách dùng đĩa đi kèm lúc mua mới cài đặt và kích hoạt Product Key được.
Đối với Office OLP (Standard, ProPlus) và Win Pro GGWA OLP thì download tại VLSC
Đối với Win, Office dạng ESD thì lúc PACISOFT order xong sẽ có link tải theo email (mới xuất hiện năm 2017)
Hướng dẫn cách tải bản cài đặt Office Fullbox gốc từ chính trang web chúng tôi thông qua việc sử dụng Product Key bản quyền có sẵn trong hộp khi bạn bị thất lạc hoặc không có đĩa DVD bản gốc kèm theo hoặc muốn cài đặt nhanh chóng khi sản phẩm đang trong quá trình giao hàng.
Chúng tôi khuyến nghị mua sản phẩm qua đại lý ủy quyền PACISOFT để nhận được sản phẩm và dịch vụ ngay lập tức trong 10 phút. Việc mua sản phẩm trên Microsoft Store sẽ có giá cao hơn 30%.
Cách 1: Nếu đã mua bản quyền Office 2016 từ trang Microsoft Store với tài khoản có sẵn (ví dụ Outlook, Live, Hotmail)
Đi tới Lịch sử đặt hàng, tìm Office 2016, sau đó chọn Khóa sản phẩm/cài đặt.
Hãy đăng nhập nếu Microsoft yêu cầu. Chọn Cài đặt.
Trình hướng dẫn sẽ cài đặt Office trong nền. Bạn có thể tiếp tục làm việc, thậm chí bắt đầu sử dụng Office trước khi cài đặt hoàn tất, nhưng hãy đảm bảo PC của bạn vẫn còn hoạt động và được kết nối Internet. Việc cài đặt mất khoảng 30 phút.
Cách 2: Nếu đã mua bản quyền Office 2016 Home and Business tại PACISOFT nhưng chưa có DVD cài đặt (có thể vì lý do giao key trước, gửi đĩa sau, hoặc thất lạc đĩa DVD)
Truy cập vào đường link setup.office.com
Đăng nhập với tài khoản Microsoft đã có sẵn (hoặc tài khoản liên kết như Domain abc@company.com)
Nhập/ dán vào ô Enter your product key lần lượt 25 kí tự của khóa bản quyền Office 2016 (tìm trên email PACISOFT gửi, hoặc trên thẻ Product key card)
Sau đó nhấn Get your Office để nhận bộ cài đặt. Lúc cài đặt sẽ không yêu cầu nhập lại product key.
Hướng Dẫn Cách Tạo Bảo Mật Hai Lớp Trên Facebook
Facebook dường như đã trở thành một phần cuộc sống của giới trẻ hiện nay. Chỉ cần một chiếc smartphone có cài đặt 3G Mobifone hay bất cứ nhà mạng nào khác là người dùng có thể online Facebook 24/24 mọi lúc mọi nơi. Tuy nhiên, điều đó cũng đồng nghĩa với việc nếu chẳng may tài khoản Facebook của bạn bị kẻ xấu hack mất thì hậu quả cũng sẽ khá nặng nề.
Hướng dẫn cách tạo bảo mật hai lớp trên Facebook
Để bảo vệ tài khoản Facebook của mình, bạn nên hạn chế hoặc tuyệt đối không dùng những ứng dụng không rõ nguồn gốc, các app vui, bói toán,… trên Facebook khi chúng yêu cầu thông tin tài khoản của bạn để đăng nhập. Ngoài ra, các link có độ hấp dẫn cao, link hot,… bạn cũng nên thận trọng trước khi nhấn vào, bởi chỉ cần mở ra thì kẻ xấu đã có thể chiếm đoạt được tài khoản của bạn.
Chưa hết, một bước quan trọng không thể thiếu để bảo vệ tài khoản chính là kích hoạt tính năng Bảo mật hai lớp sẵn có trên Facebook. Tính năng này sẽ giúp bảo vệ gần như tuyệt đối tài khoản của bạn.
Với cơ chế bảo mật hai bước, mỗi khi bạn đăng nhập vào tài khoản Facebook trên một thiết bị mới, quá trình này không chỉ yêu cầu bạn điền mật khẩu tài khoản, mà còn yêu cầu xác nhận thêm lớp mật khẩu thứ hai. Mật khẩu thứ hai này sẽ gửi về điện thoại của bạn dưới dạng tin nhắn.
Bạn phải khai báo đúng hai mật khẩu (mật khẩu hộp thư và mật khẩu thứ hai) mới có thể đăng nhập vào tài khoản. Với cách thức này, nếu hacker có đánh cắp được mật khẩu tài khoản Facebook của bạn vẫn không thể đăng nhập vào tài khoản vì còn vướng lớp bảo mật bằng mật khẩu thứ hai mà chỉ bạn mới biết.
Hãy dành ra vài phút để thực hiện các bước sau đây:
– Bước 1: Đăng nhập vào tài khoản Facebook từ trình duyệt web trên máy tính.
– Bước 2: Nhấn vào biểu tượng ổ khóa ở góc trên bên phải tài khoản Facebook, chọn Xem cài đặt khác.
– Bước 3: Chọn mục Bảo mật ở menu bên trái, nhấn vào nút Chỉnh sửa tại Xét duyệt đăng nhập ở danh sách bên phải.
– Bước 4: Sau đó đánh dấu vào tùy chọn Yêu cầu mã bảo mật để truy xuất tài khoản của tôi từ trình duyệt lạ.
– Bước 5: Nhấn vào Bắt đầu tại hộp thoại hiện ra sau đó và nhấn thêm nút Tiếp tục ở hộp thoại tiếp theo.
– Bước 6: Nhập số điện thoại di động để nhận đoạn mật khẩu bảo mật thứ hai mỗi khi đăng nhập vào tài khoản Facebook, sau đó nhấn nút Tiếp tục.
Số điện thoại này cũng có thể được sử dụng để khôi phục lại mật khẩu tài khoản Facebook trong trường hợp bạn quên mật khẩu hay tài khoản bị đánh cắp và thay đổi mật khẩu. Trong trường hợp bạn đã khai báo số điện thoại di động với Facebook trước đó thì không cần phải trải qua bước 6 này.
Sau đó, Facebook sẽ gửi về số điện thoại này tin nhắn chứa đoạn mã để xác nhận lại. Điền mã này vào hộp thoại trên Facebook rồi nhấn nút Chấp nhận để xác nhận.
Tiếp theo, bạn cần nhập lại mật khẩu tài khoản Facebook để xác nhận, sau đó một hộp thoại hiện ra, bạn đánh dấu vào tùy chọn Không, yêu cầu mã ngay lập tức rồi nhấn nút Đóng để kích hoạt chế độ bảo mật bằng mật khẩu hai lớp ngay lập tức cho tài khoản Facebook của bạn.
Từ giờ trở đi, mỗi khi bạn đăng nhập tài khoản Facebook bằng một máy tính hoặc smartphone lạ (chưa từng đăng nhập Facebook trước đó), Facebook sẽ gửi về số điện thoại bạn đã khai báo một tin nhắn có chứa mật khẩu ngẫu nhiên (OTP). Bạn sẽ phải điền mật khẩu của tài khoản Facebook, sau đó điền mật khẩu xác minh thứ 2 mới truy cập được vào tài khoản Facebook của mình.
Cập nhật thông tin chi tiết về Hướng Dẫn Tạo Bản Quyền (License Product) Bảo Mật Ứng Dụng. trên website Rafs.edu.vn. Hy vọng nội dung bài viết sẽ đáp ứng được nhu cầu của bạn, chúng tôi sẽ thường xuyên cập nhật mới nội dung để bạn nhận được thông tin nhanh chóng và chính xác nhất. Chúc bạn một ngày tốt lành!