WGShare.API/WGShare.API/Controllers/AuthController.cs

197 lines
6.7 KiB
C#

using Masuit.Tools;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using System.Configuration;
using System.Security.Claims;
using WGShare.API.Controllers.Basic;
using WGShare.API.Helpers;
using WGShare.Domain.DTOs.Login;
using WGShare.Domain.Entities;
using WGShare.Domain.FriendlyException;
namespace WGShare.API.Controllers
{
[ApiExplorerSettings(GroupName = "public")]
[Route("auth")]
public class AuthController : BasicController
{
private readonly ISqlSugarClient _sqlSugar;
private readonly JwtHelper _jwtHelper;
private readonly IConfiguration _configuration;
public AuthController(ISqlSugarClient sqlSugar, JwtHelper jwtHelper,
IConfiguration configuration)
{
_sqlSugar = sqlSugar;
_jwtHelper = jwtHelper;
this._configuration = configuration;
}
/// <summary>
/// 检查用户名
/// </summary>
/// <param name="account"></param>
/// <returns></returns>
[HttpGet("check-user"), AllowAnonymous]
public async Task<bool> CheckUser([FromQuery] string account)
{
return await _sqlSugar.Queryable<User>().AnyAsync(x => x.IsDelete == false && x.Account == account);
}
/// <summary>
/// 正常账号登录
/// </summary>
/// <returns></returns>
[HttpPost("login"), AllowAnonymous]
public async Task<IActionResult> Login([FromBody] UserLoginDTO loginDTO)
{
var user = await _sqlSugar.Queryable<User>()
.FirstAsync(x => x.Account == loginDTO.Account && x.IsDelete == false && x.Pwd == loginDTO.Pwd);
if (user == null)
{
throw Oops.Oh("用户名或密码不正确!");
}
var tenant = await _sqlSugar.Queryable<Tenant>().FirstAsync(x => x.Id == user.TenantId);
if (tenant == null || tenant.IsDelete == true)
{
throw Oops.Oh("该区域账号已停用,请联系管理员");
}
if (await _sqlSugar.Queryable<Role>().AnyAsync(x => x.IsDelete == true && x.Id == user.RoleId))
{
throw Oops.Oh("该角色账号已停用,请联系管理员");
}
var perms = await _sqlSugar.Queryable<Permission>()
.InnerJoin<RolePrem>((m, rm) => m.Id == rm.PermId)
.Where((m, rm) => rm.RoleId == user.RoleId)
.Distinct()
.ToListAsync();
var btnAutn = new List<Claim>();
btnAutn.Add(new Claim("perm", perms.Sum(x => x.PermValue).ToString()));
btnAutn.Add(new Claim("role", user.RoleId));
btnAutn.Add(new Claim("tenant", user.TenantId));
btnAutn.Add(new Claim("account", user.Account));
btnAutn.Add(new Claim("uname", user.UserName));
return Ok(new
{
perms = perms.Sum(x => x.PermValue),
token = _jwtHelper.CreateToken(user.Id, btnAutn),
roleId = user.RoleId,
userName = user.UserName,
tenantName = tenant.TenantName,
expire = _configuration["Jwt:Expires"].ToInt32(),
account = user.Account,
uid = user.Id
});
}
/// <summary>
/// 匿名登录,直接进入会议室
/// </summary>
/// <returns></returns>
[HttpPost("anon-login")]
public async Task<IActionResult> Login([FromBody] AnonymousLoginDTO loginDTO)
{
var room = await _sqlSugar.Queryable<Room>().FirstAsync(x => x.Id == loginDTO.RoomId);
if (room == null)
{
throw Oops.Oh("会议号无效");
}
var anonRoleId = "2";
// 匿名登录使用普通用户身份
var perms = await _sqlSugar.Queryable<Permission>()
.InnerJoin<RolePrem>((m, rm) => m.Id == rm.PermId)
.Where((m, rm) => rm.RoleId == anonRoleId)
.Distinct()
.ToListAsync();
var tenant = await _sqlSugar.Queryable<Tenant>().FirstAsync(x => x.Id == room.TenantId);
if (tenant == null || tenant.IsDelete == true)
{
throw Oops.Oh("该区域账号已停用,请联系管理员");
}
var btnAutn = new List<Claim>();
btnAutn.Add(new Claim("perm", perms.Sum(x => x.PermValue).ToString()));
btnAutn.Add(new Claim("role", anonRoleId));
btnAutn.Add(new Claim("tenant", room.TenantId));
btnAutn.Add(new Claim("mac", loginDTO.Mac));
btnAutn.Add(new Claim("machine", loginDTO.MachineName));
btnAutn.Add(new Claim("nickName", loginDTO.NickName));
return Ok(new
{
perms = perms.Sum(x => x.PermValue),
token = _jwtHelper.CreateToken("0", btnAutn),
roleId = anonRoleId,
userName = loginDTO.NickName,
tenantName = tenant.TenantName
});
}
/// <summary>
/// 登出(暂未处理任何业务逻辑)
/// </summary>
/// <returns></returns>
[HttpPost("logout")]
public async Task<bool> Logout()
{
return true;
}
#region
/// <summary>
/// 管理员登录
/// </summary>
/// <returns></returns>
[HttpPost("admin/login"), AllowAnonymous]
public async Task<string> LoginForAdmin([FromBody] UserLoginDTO loginDTO)
{
var adminClient = _sqlSugar.AsTenant().GetConnection("usercenter");
var user = await adminClient.Queryable<Admin>()
.FirstAsync(x => x.Account == loginDTO.Account && x.Password == loginDTO.Pwd);
if (user == null)
{
throw Oops.Oh("用户名或密码不正确!");
}
return _jwtHelper.CreateToken(user.Id);
}
/// <summary>
/// 管理员信息
/// </summary>
/// <returns></returns>
[HttpGet("admin/info")]
public async Task<IActionResult> GetAdminInfo()
{
var adminClient = _sqlSugar.AsTenant().GetConnection("usercenter");
var user = await adminClient.Queryable<Admin>()
.FirstAsync(x => x.Id == UId);
if (user == null)
{
throw Oops.Oh("管理员不存在!");
}
return Ok(new
{
name = user.Name,
id = user.Id,
});
}
#endregion
}
}