登录  /  注册
博主信息
博文 98
粉丝 1
评论 0
访问量 77905
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
RBAC原则设计Friday权限管理系统(8)
阿杰
原创
262人浏览过

1、实现登录验证和鉴权

pom.xml

  1. <!-- 实现登录验证和鉴权 -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-security</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.alibaba</groupId>
  8. <artifactId>fastjson</artifactId>
  9. <version>1.2.56</version>
  10. </dependency>

config/SecurityConfig

  1. /**
  2. * spring security配置
  3. * */
  4. @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
  5. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  6. //认证失败处理类
  7. @Autowired
  8. private AuthenticationEntryPointImpl unauthorizedHandler;
  9. @Override
  10. protected void configure(HttpSecurity httpSecurity) throws Exception {
  11. httpSecurity
  12. // csrf禁用,因为不使用session
  13. .csrf().disable()
  14. // 认证失败处理类
  15. .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
  16. // 基于token,所以不需要session
  17. .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
  18. // 过滤请求
  19. .authorizeRequests()
  20. // 对于登录login允许匿名访问
  21. .antMatchers("/login","/profile/avatar/**").anonymous()
  22. .antMatchers(
  23. HttpMethod.GET,
  24. "/*.html",
  25. "/**/*.html",
  26. "/**/*.css",
  27. "/**/*.js"
  28. ).permitAll()
  29. .antMatchers("/profile/**").anonymous()
  30. // 除了这些,都要授权
  31. .anyRequest().authenticated()
  32. .and()
  33. .headers().frameOptions().disable();
  34. }
  35. }

security/handle/AuthenticationEntryPointImpl

  1. /**
  2. * 认证失败处理类返回未授权
  3. * */
  4. @Component
  5. public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint, Serializable {
  6. private static final long serialVersionUID = -8970718410437077606L;
  7. @Override
  8. public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e) throws IOException {
  9. int code = HttpStatus.UNAUTHORIZED;
  10. String msg = StringUtils.format("请求访问:{},认证失败,无法访问系统资源", request.getRequestURI());
  11. ServletUtils.renderString(response, JSON.toJSONString(RestResult.error(code,msg)));
  12. }
  13. }

security/service/UserDetailServiceImpl

  1. package edu.friday.common.security.service;
  2. import edu.friday.common.enums.UserStatus;
  3. import edu.friday.common.exception.BaseException;
  4. import edu.friday.common.security.LoginUser;
  5. import edu.friday.model.SysUser;
  6. import edu.friday.model.vo.SysUserVo;
  7. import edu.friday.service.SysUserService;
  8. import edu.friday.utils.BeanUtils;
  9. import edu.friday.utils.StringUtils;
  10. import org.slf4j.Logger;
  11. import org.slf4j.LoggerFactory;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.security.core.userdetails.UserDetails;
  14. import org.springframework.security.core.userdetails.UserDetailsService;
  15. import org.springframework.security.core.userdetails.UsernameNotFoundException;
  16. import org.springframework.stereotype.Service;
  17. /**
  18. * 用户验证处理
  19. * */
  20. @Service
  21. public class UserDetailsServiceImpl implements UserDetailsService {
  22. private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class);
  23. @Autowired
  24. private SysUserService userService;
  25. @Autowired
  26. private SysPermissionService permissionService;
  27. @Override
  28. public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
  29. SysUser user = userService.selectUserByUserName(username);
  30. if(StringUtils.isNull(user)){
  31. log.info("登录用户:{} 不存在.",username);
  32. throw new UsernameNotFoundException("登录用户:" + username + " 不存在");
  33. } else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) {
  34. log.info("登录用户:{} 已被删除.",username);
  35. throw new BaseException("对不起,您的账号:" + username + "已被删除");
  36. } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
  37. log.info("登录用户:{} 已被停用.",username);
  38. throw new BaseException("对不起,您的账号:" + username + "已被停用");
  39. }
  40. return createLoginUser(user);
  41. }
  42. public UserDetails createLoginUser(SysUser user){
  43. SysUserVo sysUserVo = new SysUserVo();
  44. BeanUtils.copyProperties(user,sysUserVo);
  45. return new LoginUser(sysUserVo,permissionService.getMenuPermission(sysUserVo));
  46. }
  47. }

security/LoginUser

  1. package edu.friday.common.security;
  2. import com.fasterxml.jackson.annotation.JsonIgnore;
  3. import edu.friday.model.vo.SysUserVo;
  4. import lombok.AllArgsConstructor;
  5. import lombok.Data;
  6. import lombok.NoArgsConstructor;
  7. import org.springframework.security.core.GrantedAuthority;
  8. import org.springframework.security.core.userdetails.UserDetails;
  9. import java.util.Collection;
  10. import java.util.Set;
  11. @Data
  12. @NoArgsConstructor
  13. @AllArgsConstructor
  14. public class LoginUser implements UserDetails {
  15. private static final long serialVersionUID = 1L;
  16. /**
  17. * 用户唯一标识
  18. * */
  19. private String token;
  20. /**
  21. * 登录时间
  22. * */
  23. private Long loginTime;
  24. /**
  25. * 过期时间
  26. * */
  27. private Long expireTime;
  28. /**
  29. * 登录IP地址
  30. * */
  31. private String ipaddr;
  32. /**
  33. * 登录地点
  34. * */
  35. private String loginLocation;
  36. /**
  37. * 浏览器类型
  38. * */
  39. private String browser;
  40. /**
  41. * 操作系统
  42. * */
  43. private String os;
  44. /**
  45. * 权限列表
  46. * */
  47. private Set<String> permissions;
  48. /**
  49. * 用户信息
  50. * */
  51. private SysUserVo user;
  52. public LoginUser(SysUserVo user, Set<String> permissions) {
  53. this.user = user;
  54. this.permissions = permissions;
  55. }
  56. @Override
  57. public Collection<? extends GrantedAuthority> getAuthorities() {
  58. return null;
  59. }
  60. @JsonIgnore
  61. @Override
  62. public String getPassword() {
  63. return null;
  64. }
  65. @Override
  66. public String getUsername() {
  67. return null;
  68. }
  69. /**
  70. * 账户是否过期,过期无法验证
  71. * */
  72. @Override
  73. public boolean isAccountNonExpired() {
  74. return false;
  75. }
  76. /**
  77. * 指定用户是否解锁,锁定的用户无法进行身份验证
  78. * */
  79. @JsonIgnore
  80. @Override
  81. public boolean isAccountNonLocked() {
  82. return false;
  83. }
  84. /**
  85. * 指示是否已过期的用户的凭据(密码),过期的凭据防止认证
  86. *
  87. * @return
  88. */
  89. @JsonIgnore
  90. @Override
  91. public boolean isCredentialsNonExpired() {
  92. return false;
  93. }
  94. /**
  95. * 是否可用 ,禁用的用户不能身份验证
  96. *
  97. * @return
  98. */
  99. @Override
  100. public boolean isEnabled() {
  101. return false;
  102. }
  103. }

service/impl/SysUserServiceImpl

  1. /**
  2. * 通过用户名称查找用户
  3. * @param userName 用户名
  4. * return 用户对象信息
  5. * */
  6. @Override
  7. public SysUser selectUserByUserName(String userName) {
  8. SysUser sysUser = new SysUser();
  9. sysUser.setUserName(userName);
  10. sysUser.setDelFlag("0");
  11. Example<SysUser> example = Example.of(sysUser);
  12. return findOne(example);
  13. }

security/service/SysPermissionService

  1. package edu.friday.common.security.service;
  2. import edu.friday.model.vo.SysUserVo;
  3. import edu.friday.service.SysMenuService;
  4. import edu.friday.service.SysRoleService;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Component;
  7. import java.util.HashSet;
  8. import java.util.Set;
  9. @Component
  10. public class SysPermissionService {
  11. @Autowired
  12. private SysRoleService roleService;
  13. @Autowired
  14. private SysMenuService menuService;
  15. /**
  16. * 获取角色权限
  17. * */
  18. public Set<String> getRolePermission(SysUserVo user){
  19. Set<String> roles = new HashSet<String>();
  20. // 管理员拥有所有权限
  21. if(user.isAdmin()){
  22. roles.add("admin");
  23. }else{
  24. roles.addAll(roleService.selectRolePermissionByUserId(user.getUserId()));
  25. }
  26. return roles;
  27. }
  28. /**
  29. * 获取菜单数据权限
  30. *
  31. * @param user 用户信息
  32. * return 菜单权限信息
  33. * */
  34. public Set<String> getMenuPermission(SysUserVo user){
  35. Set<String> roles = new HashSet<String>();
  36. // 管理员拥有所有权限
  37. if(user.isAdmin()){
  38. roles.add("*:*:*");
  39. }else{
  40. roles.addAll(menuService.selectMenuPermsByUserId(user.getUserId()));
  41. }
  42. return roles;
  43. }
  44. }

service/impl/SysRoleServiceImpl

  1. @Override
  2. public Set<String> selectRolePermissionByUserId(Long userId) {
  3. List<SysRole> perms = sysRoleRepository.selectRoleByUserId(userId);
  4. Set<String> permsSet = new HashSet<>();
  5. for (SysRole perm:perms) {
  6. if(StringUtils.isNotNull(perm)){
  7. permsSet.addAll(Arrays.asList(perm.getRoleKey().trim().split(",")));
  8. }
  9. }
  10. return permsSet;
  11. }

service/impl/SysMenuServiceImpl

  1. /**
  2. * 根据用户id查询权限
  3. * @param userId 用户id
  4. *
  5. * @return 权限列表
  6. * */
  7. @Override
  8. public Set<String> selectMenuPermsByUserId(Long userId) {
  9. List<String> perms = sysMenuRepository.selectMenuPermsByUserId(userId);
  10. Set<String> permsSet = new HashSet<>();
  11. for (String perm:perms){
  12. if(StringUtils.isNotEmpty(perm)){
  13. permsSet.addAll(Arrays.asList(perm.trim().split(",")));
  14. }
  15. }
  16. return permsSet;
  17. }

repository/custom/SysMenuRepository

  1. package edu.friday.repository.custom;
  2. import edu.friday.model.SysMenu;
  3. import org.springframework.data.jpa.repository.JpaRepository;
  4. import org.springframework.data.jpa.repository.Query;
  5. import org.springframework.data.repository.query.Param;
  6. import java.util.List;
  7. public interface SysMenuRepository extends JpaRepository<SysMenu,Long> {
  8. final String JOIN_ROLE_MENU = " left join sys_role_menu rm on m.menu_id = rm.menu_id ";
  9. final String JOIN_USER_ROLE = " left join sys_user_role ur on rm.role_id = ur.role_id ";
  10. @Query(value = " select distinct m.perms from sys_menu m" + JOIN_ROLE_MENU + JOIN_USER_ROLE
  11. + " where ur.user_id = :userId", nativeQuery = true)
  12. List<String> selectMenuPermsByUserId(@Param("userId") Long userId);
  13. }

本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学