功能权限课程:从入门到初级掌握
2024/10/31 23:03:00
本文主要是介绍功能权限课程:从入门到初级掌握,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
本文详细介绍了功能权限课程的内容,包括功能权限的基本概念、重要性、常见工具及设置方法,并通过实战案例进一步说明了具体应用。文章还涵盖了用户、权限、角色和资源等基本术语,帮助读者全面理解功能权限管理。此外,文章提供了多个实际项目中的功能权限设置示例以及常见问题的解决办法。
引入功能权限概念什么是功能权限
功能权限是指系统或应用程序中对用户访问和操作权限的管理。具体来说,功能权限决定了用户能够执行哪些操作和访问哪些资源。它通常通过一组规则来定义,这些规则会根据用户的角色和身份来分配不同的权限级别。
例如,一个电子商务网站可能有不同的权限级别,如普通用户、管理员和管理员助理。每个级别都有不同的访问权限,例如普通用户只能查看商品和下单,而管理员则可以管理商品、处理订单和查看统计信息。
功能权限的重要性
功能权限的重要性体现在以下几个方面:
- 安全性:功能权限能够限制用户仅访问其需要的资源和执行其需要的操作,从而减少安全威胁和数据泄露的风险。
- 合规性:很多行业,如金融、医疗等,都有严格的数据保护和访问控制要求。功能权限可以帮助企业满足这些合规性要求。
- 用户体验:功能权限还可以改善用户体验。通过向用户提供合适的权限级别,可以确保他们能够轻松地完成所需任务,而不会因为权限不足而无法操作。
功能权限在不同场景中的应用
功能权限在很多场景中都有应用,包括但不限于以下几种:
- 企业内部系统:企业内部系统通常需要根据员工的职位和职责分配不同的权限。例如,财务部门的员工可能需要访问财务报表,而销售部门的员工则可能需要访问客户资料。
- 电子商务网站:电子商务网站通常会有普通用户、管理员等不同角色,每个角色有不同的权限。
- 社交媒体平台:社交媒体平台会根据用户角色分配不同的权限。例如,普通用户可以发布内容和评论,而管理员可以管理用户账户和内容审核。
- 移动应用:移动应用也可能需要功能权限。例如,手机操作系统需要应用请求读取短信、定位等权限,确保应用只能访问用户明确授权的数据。
实际应用案例
假设有一个在线教育平台,需要设置不同的用户角色和权限:
- 普通用户:可以浏览课程和注册课程。
- 教师用户:可以创建和编辑课程、上传教学材料、管理学生。
- 管理员:可以管理所有用户信息、维护系统和管理所有课程。
每个用户角色都有不同的权限集,通过权限管理系统进行管理。
实践示例
在实际编程中,可以使用Python和Flask框架来设置简单的权限管理系统。
from flask import Flask, redirect, url_for, session, request from functools import wraps app = Flask(__name__) app.secret_key = 'your_secret_key' def login_required(f): @wraps(f) def decorated_function(*args, **kwargs): if 'username' not in session: return redirect(url_for('login', next=request.url)) return f(*args, **kwargs) return decorated_function def role_required(role): def decorator(f): @wraps(f) def decorated_function(*args, **kwargs): if 'role' not in session or session['role'] != role: return redirect(url_for('unauthorized')) return f(*args, **kwargs) return decorated_function return decorator @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': # Simulate login process session['username'] = request.form['username'] session['role'] = request.form['role'] return redirect(request.form['next']) return "Login page" @app.route('/logout') def logout(): session.pop('username', None) session.pop('role', None) return redirect(url_for('login')) @app.route('/') @login_required def home(): return "Home page" @app.route('/admin') @login_required @role_required('admin') def admin(): return "Admin page" @app.route('/unauthorized') def unauthorized(): return "You are not authorized to access this page" if __name__ == '__main__': app.run(debug=True)功能权限的基本术语
用户
用户指的是能够与系统进行交互的实体。用户可以是真实的人,也可以是系统中的一个虚拟实体(例如,一个服务账号)。每个用户通常都有一个唯一的标识符,如用户名或用户ID。此外,用户还可以分配不同的角色和权限。
权限
权限是指用户可以执行的具体操作。在权限管理系统中,权限通常被定义为一组规则,这些规则规定了用户可以进行的操作。例如,一个权限可以是“读取文件”、“修改数据库记录”等。权限通常与特定资源相关联,如文件、数据库表或API端点。
角色
角色是对一组权限的抽象。角色可以看作是权限的集合,定义了一组相关的权限。通过分配角色,可以方便地管理和分配权限。例如,一个“管理员”角色可以包括“创建用户”、“修改用户信息”、“删除用户”等权限。
资源
资源是指用户可以访问和操作的对象。资源可以是文件、数据库表、API端点、网络服务等。资源通常与特定权限相关联,表示用户可以对这些资源进行的操作。例如,一个文件资源可能有“读取”、“写入”、“删除”等权限。
实践示例
假设有一个简单的Web应用程序,使用Python Flask框架实现基本的功能权限管理。
from flask import Flask, redirect, url_for, session, request from functools import wraps app = Flask(__name__) app.secret_key = 'your_secret_key' def login_required(f): @wraps(f) def decorated_function(*args, **kwargs): if 'username' not in session: return redirect(url_for('login', next=request.url)) return f(*args, **kwargs) return decorated_function def role_required(role): def decorator(f): @wraps(f) def decorated_function(*args, **kwargs): if 'role' not in session or session['role'] != role: return redirect(url_for('unauthorized')) return f(*args, **kwargs) return decorated_function return decorator @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': # Simulate login process session['username'] = request.form['username'] session['role'] = request.form['role'] return redirect(request.form['next']) return "Login page" @app.route('/logout') def logout(): session.pop('username', None) session.pop('role', None) return redirect(url_for('login')) @app.route('/') @login_required def home(): return "Home page" @app.route('/admin') @login_required @role_required('admin') def admin(): return "Admin page" @app.route('/unauthorized') def unauthorized(): return "You are not authorized to access this page" if __name__ == '__main__': app.run(debug=True)如何设置基本的功能权限
创建用户账户
创建用户账户是权限管理的第一步。用户账户通常需要包含以下信息:
- 用户名:用户的唯一标识符。
- 密码:用于验证用户身份。
- 角色:用户的权限级别,如普通用户、管理员等。
- 权限集:用户可以执行的具体操作。
可以使用Python和Flask框架来实现用户账户的创建。以下是一个简单的示例:
from flask import Flask, request, redirect, url_for from flask_sqlalchemy import SQLAlchemy from werkzeug.security import generate_password_hash, check_password_hash app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db' db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) password_hash = db.Column(db.String(128), nullable=False) role = db.Column(db.String(20), default='user') def set_password(self, password): self.password_hash = generate_password_hash(password) def check_password(self, password): return check_password_hash(self.password_hash, password) @app.route('/register', methods=['GET', 'POST']) def register(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] role = request.form['role'] new_user = User(username=username) new_user.set_password(password) new_user.role = role db.session.add(new_user) db.session.commit() return redirect(url_for('login')) return "Registration page" if __name__ == '__main__': db.create_all() app.run(debug=True)
分配权限和角色
分配权限和角色是权限管理的核心。权限可以细分为多个具体的操作,而角色则是对一组权限的抽象。角色可以定义一组相关的权限,通过分配角色,可以方便地管理和分配权限。
以下是一个简单的Python示例,展示了如何分配权限和角色:
class Role: def __init__(self, name, permissions): self.name = name self.permissions = permissions class User: def __init__(self, username, role): self.username = username self.role = role def has_permission(self, permission): return permission in self.role.permissions # 定义不同的角色和权限 admin_role = Role('admin', ['create_user', 'edit_user', 'delete_user', 'view_user']) user_role = Role('user', ['view_user']) # 创建用户并分配角色 admin_user = User('admin_user', admin_role) user_user = User('user_user', user_role) # 检查权限 print(admin_user.has_permission('create_user')) # 输出: True print(user_user.has_permission('create_user')) # 输出: False
设置资源访问权限
设置资源访问权限是指定义用户可以访问哪些资源和执行哪些操作。资源可以是文件、数据库表、API端点等。可以使用基于角色的权限控制(RBAC)来设置资源访问权限。
以下是一个简单的Python示例,展示了如何设置资源访问权限:
class Resource: def __init__(self, name, permissions): self.name = name self.permissions = permissions class User: def __init__(self, username, role): self.username = username self.role = role def can_access(self, resource): for permission in self.role.permissions: if permission in resource.permissions: return True return False # 定义不同的资源和权限 user_resource = Resource('user_resource', ['read', 'write']) admin_resource = Resource('admin_resource', ['read', 'write', 'delete']) # 创建用户并分配角色 admin_user = User('admin_user', admin_role) user_user = User('user_user', user_role) # 检查资源访问权限 print(admin_user.can_access(admin_resource)) # 输出: True print(user_user.can_access(admin_resource)) # 输出: False print(user_user.can_access(user_resource)) # 输出: True
实践示例
假设有一个简单的Web应用程序,使用Python Flask框架实现用户账户的创建和权限分配。
from flask import Flask, request, redirect, url_for from flask_sqlalchemy import SQLAlchemy from werkzeug.security import generate_password_hash, check_password_hash app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db' db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) password_hash = db.Column(db.String(128), nullable=False) role = db.Column(db.String(20), default='user') def set_password(self, password): self.password_hash = generate_password_hash(password) def check_password(self, password): return check_password_hash(self.password_hash, password) @app.route('/register', methods=['GET', 'POST']) def register(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] role = request.form['role'] new_user = User(username=username) new_user.set_password(password) new_user.role = role db.session.add(new_user) db.session.commit() return redirect(url_for('login')) return "Registration page" @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] user = User.query.filter_by(username=username).first() if user and user.check_password(password): session['username'] = username session['role'] = user.role return redirect(url_for('home')) else: return "Invalid username or password" return "Login page" @app.route('/') def home(): return f"Welcome {session.get('username', 'guest')}" @app.route('/admin') @login_required @role_required('admin') def admin(): return "Admin page" @app.route('/logout') def logout(): session.pop('username', None) session.pop('role', None) return redirect(url_for('login')) if __name__ == '__main__': db.create_all() app.run(debug=True)常见功能权限工具介绍
常用的功能权限管理工具
有许多工具和框架可以帮助开发者实现功能权限管理,以下是几个常见的工具:
- Apache Shiro
- Shiro 是一个强大且简单的 Java 安全框架,支持认证、授权、加密等。Shiro 可以与各种应用程序框架集成,包括 Spring 和 Java SE 应用程序。
- Spring Security
- Spring Security 是一个强大且灵活的 Java 安全框架,与 Spring 框架紧密集成。它可以处理认证、授权、会话管理等。
- Keycloak
- Keycloak 是一个开源的身份和访问管理(IAM)解决方案,支持多种认证方式,如 OAuth、OpenID Connect 和 SAML。Keycloak 还支持细粒度的权限控制。
- RBAC (Role-Based Access Control)
- RBAC 是一种基于角色的权限控制模型,适用于不同场景下的权限管理。许多应用程序框架和工具都支持 RBAC 模型。
- Flask-Security
- Flask-Security 是一个基于 Flask 框架的身份和权限管理工具,支持认证、授权、密码管理等。
- Django 自带的权限管理
- Django 框架自带了强大的权限管理功能,支持认证、授权、会话管理等。Django 的权限管理系统非常适合快速开发 Web 应用程序。
各工具的简单安装与配置
Apache Shiro 安装与配置
-
安装 Shiro
pip install shiro
-
配置 Shiro
// 配置文件 shiro.ini [main] cacheManager = org.apache.shiro.cache.MemoryConstrainedCacheManager securityManager.cacheManager = $cacheManager [users] admin = adminpassword guest = guestpassword [roles] admin = admin // Java 代码示例 ShiroConfig config = new ShiroConfig(); config.setUsers("admin=adminpassword", "guest=guestpassword"); config.setRoles("admin=admin"); SecurityManager securityManager = config.build(); SecurityUtils.setSecurityManager(securityManager); Subject currentUser = SecurityUtils.getSubject(); if (currentUser.isAuthenticated()) { System.out.println("Logged in"); }
Spring Security 安装与配置
-
安装 Spring Security
pip install spring-security
-
配置 Spring Security
<!-- 配置文件 application-context.xml --> <bean id="authenticationManager" class="org.springframework.security.authentication.ProviderManager"> <property name="providers"> <list> <bean class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"> <property name="userDetailsService" ref="userDetailsService"/> <property name="passwordEncoder" ref="passwordEncoder"/> </bean> </list> </property> </bean> <bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" /> <bean id="userDetailsService" class="com.example.security.UserDetailsService" /> <http auto-config="true"> <intercept-url pattern="/admin/**" access="hasRole('ROLE_ADMIN')" /> <intercept-url pattern="/user/**" access="hasRole('ROLE_USER')" /> <form-login login-page="/login" default-target-url="/home" /> <logout logout-url="/logout" /> </http> <authentication-manager> <authentication-provider user-service-ref="userDetailsService" /> </authentication-manager>
Keycloak 安装与配置
-
安装 Keycloak
docker run -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin -p 8080:8080 jboss/keycloak
- 配置 Keycloak
- 访问
http://localhost:8080/auth
- 创建新的 Realm 和 Client
- 配置用户角色和权限
- 访问
RBAC (Role-Based Access Control)
-
安装 RBAC
- RBAC 通常集成在应用程序框架中,如 Spring、Django 等。
- 配置 RBAC
- 在应用程序框架中定义角色和权限
- 在用户账户中分配角色
- 在控制器或服务中进行权限检查
Flask-Security 安装与配置
-
安装 Flask-Security
pip install flask-security
-
配置 Flask-Security
from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_security import Security, SQLAlchemyUserDatastore, UserMixin, RoleMixin, login_required app = Flask(__name__) app.config['SECRET_KEY'] = 'mysecretkey' app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db' db = SQLAlchemy(app) class Role(db.Model, RoleMixin): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(80), unique=True) description = db.Column(db.String(255)) class User(db.Model, UserMixin): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(255), unique=True) password = db.Column(db.String(255)) roles = db.relationship('Role', secondary='user_roles') # 连接用户和角色表 class UserRoles(db.Model): id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey('user.id')) role_id = db.Column(db.Integer, db.ForeignKey('role.id')) user_datastore = SQLAlchemyUserDatastore(db, User, Role) security = Security(app, user_datastore) @app.route('/') @login_required def home(): return "Welcome!" if __name__ == '__main__': db.create_all() with app.app_context(): user_datastore.create_role(name='admin') user_datastore.create_role(name='user') user_datastore.create_user(username='admin', password='admin') db.session.commit() app.run(debug=True)
Django 自带的权限管理安装与配置
-
安装 Django
pip install django
-
配置 Django
from django.contrib.auth.models import User from django.db import models from django.contrib.auth.models import Group from django.contrib.auth.models import Permission class UserProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) group = models.ForeignKey(Group, on_delete=models.CASCADE) # 创建用户和角色 user = User.objects.create_user(username='admin', password='admin') group = Group.objects.create(name='admin') group.permissions.add(Permission.objects.get(codename='view_user')) # 配置 Django 认证和权限 from django.contrib.auth.decorators import login_required, permission_required from django.shortcuts import render @login_required @permission_required('auth.view_user', raise_exception=True) def admin_view(request): return render(request, 'admin_view.html') @login_required def user_view(request): return render(request, 'user_view.html')
实践示例
假设有一个简单的Web应用程序,使用Django框架实现基本的功能权限管理。
from django.contrib.auth.models import User, Group, Permission from django.db import models class UserProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) group = models.ForeignKey(Group, on_delete=models.CASCADE) # 创建用户和角色 user = User.objects.create_user(username='admin', password='admin') group = Group.objects.create(name='admin') group.permissions.add(Permission.objects.get(codename='view_user')) # 配置Django认证和权限 from django.contrib.auth.decorators import login_required, permission_required from django.shortcuts import render @login_required @permission_required('auth.view_user', raise_exception=True) def admin_view(request): return render(request, 'admin_view.html') @login_required def user_view(request): return render(request, 'user_view.html')功能权限管理实战案例
实际项目中的功能权限设置
假设有一个在线教育平台,需要设置不同用户角色和权限。以下是一个简单的示例,展示了如何设置用户角色和权限。
from flask import Flask, redirect, url_for, session, request from functools import wraps import os app = Flask(__name__) app.secret_key = os.urandom(24) def login_required(f): @wraps(f) def decorated_function(*args, **kwargs): if 'username' not in session: return redirect(url_for('login', next=request.url)) return f(*args, **kwargs) return decorated_function def role_required(role): def decorator(f): @wraps(f) def decorated_function(*args, **kwargs): if 'role' not in session or session['role'] != role: return redirect(url_for('unauthorized')) return f(*args, **kwargs) return decorated_function return decorator @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': session['username'] = request.form['username'] session['role'] = request.form['role'] return redirect(request.form['next']) return "Login page" @app.route('/logout') def logout(): session.pop('username', None) session.pop('role', None) return redirect(url_for('login')) @app.route('/') @login_required def home(): return "Home page" @app.route('/admin') @login_required @role_required('admin') def admin(): return "Admin page" @app.route('/unauthorized') def unauthorized(): return "You are not authorized to access this page" if __name__ == '__main__': app.run(debug=True)
在这个示例中,我们定义了用户角色(如普通用户、管理员)和权限(如访问主页、访问管理员页面)。用户登录后,根据其角色分配不同的权限。
常见问题及解决办法
问题1:用户无法访问特定资源
解决办法:
- 确保用户拥有访问该资源的权限。
- 检查权限分配是否正确,是否遗漏某些权限。
# 示例代码 user = User.query.get(session['user_id']) if 'read' in user.permissions: return "User has read permission" else: return "User does not have read permission"
问题2:权限管理过于复杂
解决办法:
- 使用角色(Role)来抽象权限,通过角色分配权限。
- 使用第三方库或框架(如Spring Security、Flask-Security)来简化权限管理。
# 示例代码 class Role: def __init__(self, name, permissions): self.name = name self.permissions = permissions class User: def __init__(self, username, role): self.username = username self.role = role def has_permission(self, permission): return permission in self.role.permissions
问题3:用户角色和权限管理混乱
解决办法:
- 维护一个清晰的权限和角色定义文档。
- 使用数据库或配置文件来管理权限分配。
# 示例代码 from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy(app) class Role(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(80), unique=True, nullable=False) permissions = db.Column(db.String(255), nullable=False) class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) role_id = db.Column(db.Integer, db.ForeignKey('role.id')) def has_permission(self, permission): role = Role.query.get(self.role_id) return permission in role.permissions
问题4:权限设置不够灵活
解决办法:
- 使用细粒度的权限控制,允许用户自定义权限设置。
- 使用动态权限管理,根据用户的实时需求调整权限。
# 示例代码 class DynamicPermission: def __init__(self, user, resource): self.user = user self.resource = resource def can_access(self): return self.resource.permissions_allowed(self.user.role.permissions)
实践示例
假设有一个简单的Web应用程序,使用Python Flask框架实现用户角色和权限管理。
from flask import Flask, request, redirect, url_for from flask_sqlalchemy import SQLAlchemy from werkzeug.security import generate_password_hash, check_password_hash app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db' db = SQLAlchemy(app) class Role(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(80), unique=True, nullable=False) permissions = db.Column(db.String(255), nullable=False) class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) password_hash = db.Column(db.String(128), nullable=False) role_id = db.Column(db.Integer, db.ForeignKey('role.id')) def set_password(self, password): self.password_hash = generate_password_hash(password) def check_password(self, password): return check_password_hash(self.password_hash, password) def has_permission(self, permission): role = Role.query.get(self.role_id) return permission in role.permissions @app.route('/register', methods=['GET', 'POST']) def register(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] role_name = request.form['role_name'] role = Role.query.filter_by(name=role_name).first() if not role: return "Role not found" new_user = User(username=username, role_id=role.id) new_user.set_password(password) db.session.add(new_user) db.session.commit() return redirect(url_for('login')) return "Registration page" @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] next_url = request.form['next'] user = User.query.filter_by(username=username).first() if user and user.check_password(password): session['username'] = username session['role_id'] = user.role_id return redirect(next_url) else: return "Invalid username or password" return "Login page" @app.route('/') @login_required def home(): return "Home page" @app.route('/admin') @login_required def admin(): return "Admin page" @app.route('/unauthorized') def unauthorized(): return "You are not authorized to access this page" def login_required(f): @wraps(f) def decorated_function(*args, **kwargs): if 'username' not in session: return redirect(url_for('login', next=request.url)) return f(*args, **kwargs) return decorated_function def role_required(permission): def decorator(f): @wraps(f) def decorated_function(*args, **kwargs): user = User.query.filter_by(username=session['username']).first() if user and user.has_permission(permission): return f(*args, **kwargs) else: return redirect(url_for('unauthorized')) return decorated_function return decorator if __name__ == '__main__': db.create_all() app.run(debug=True)总结与资源推荐
功能权限课程学习总结
在本课程中,我们系统地介绍了功能权限的概念、基本术语、工具、设置方法以及实战案例。通过学习,您应该能够理解以下内容:
- 功能权限的基本概念:包括用户、权限、角色和资源。
- 功能权限的重要性:安全性、合规性、用户体验。
- 常用的功能权限管理工具:Apache Shiro、Spring Security、Keycloak、RBAC、Flask-Security、Django 自带的权限管理。
- 如何设置功能权限:创建用户账户、分配角色和权限、设置资源访问权限。
- 实战案例:实际项目中的功能权限设置和常见问题解决办法。
推荐进一步学习的资源
为了进一步学习功能权限管理,您可以参考以下资源:
- 慕课网:慕课网提供了许多关于安全和权限管理的课程,可以帮助您深入了解相关概念和技术。
- 官方文档:许多框架和工具都有详细的官方文档,如 Flask-Security、Spring Security、Keycloak 的文档。
- 技术论坛和社区:Stack Overflow、GitHub、Reddit 等社区提供了丰富的资源和技术交流机会。
- 书籍和论文:虽然本课程没有推荐书籍,但您可以通过图书馆或在线资源查找有关安全和权限管理的书籍和论文。
这篇关于功能权限课程:从入门到初级掌握的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-15JavaMailSender是什么,怎么使用?-icode9专业技术文章分享
- 2024-11-15JWT 用户校验学习:从入门到实践
- 2024-11-15Nest学习:新手入门全面指南
- 2024-11-15RestfulAPI学习:新手入门指南
- 2024-11-15Server Component学习:入门教程与实践指南
- 2024-11-15动态路由入门:新手必读指南
- 2024-11-15JWT 用户校验入门:轻松掌握JWT认证基础
- 2024-11-15Nest后端开发入门指南
- 2024-11-15Nest后端开发入门教程
- 2024-11-15RestfulAPI入门:新手快速上手指南