赞
踩
server:
port: 8003
servlet:
session:
cookie:
#防止Cookie冲突,冲突会导致登录验证不通过
name: OAUTH2-CLIENT-SESSIONID03
其中整合了swagger的两个配置文件和本项目无关,可忽略。
auth端:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
还有一些必要的组件是放到了common模块,然后在auth端引入common模块就好了。比如有nacos,一些实体类等等。要记得引入common后也要做必要的配置,比如nacos,相关配置可见博客:https://blog.csdn.net/qq_41076797/article/details/128509393、https://blog.csdn.net/qq_41076797/article/details/128508723;这里就不详细说了。
package com.lyy.yingwudemo.yingwu_auth.service; /** * @author :lyy * @date : 04-06-10:15 */ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import java.util.Collection; /** * 登录用户身份权限 * * @author ruoyi */ @Data @Builder @AllArgsConstructor @NoArgsConstructor public class LoginUser implements UserDetails { private static final long serialVersionUID = 1L; /** * 扩展字段 */ private Long userId; /** * 默认字段 */ private String username; private String password; private Boolean enabled; private Collection<SimpleGrantedAuthority> authorities; @Override public Collection<? extends GrantedAuthority> getAuthorities() { return this.authorities; } @Override public String getPassword() { return this.password; } @Override public String getUsername() { return this.username; } @Override public boolean isAccountNonExpired() { return true; } @Override public boolean isAccountNonLocked() { return true; } @Override public boolean isCredentialsNonExpired() { return true; } @Override public boolean isEnabled() { return this.enabled; } }
package com.lyy.yingwudemo.yingwu_auth.service; import com.alibaba.fastjson.TypeReference; import com.lyy.yingwuDemo.yingwu_common.entity.User; import com.lyy.yingwuDemo.yingwu_common.utils.R; import com.lyy.yingwudemo.yingwu_auth.feign.MemberFeignService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AccountExpiredException; import org.springframework.security.authentication.DisabledException; import org.springframework.security.authentication.LockedException; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.Collection; /** * @author :lyy * @date : 04-06-13:21 */ @Service @Slf4j public class UserDetailServiceImpl implements UserDetailsService { @Autowired private MemberFeignService memberFeignService; /** * * @param username * @return 就是负责构建一个UserDetails,咱们之前构建的实体类LoginUser就实现了UserDetails,所以是符合要求的 * @throws UsernameNotFoundException */ @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // 后面从管理端获取用户信息 R r = memberFeignService.getMemberUsername(username); TypeReference<User> typeReference = new TypeReference<User>() { }; User user=r.getData("user",typeReference); if(user==null) throw new UsernameNotFoundException("用户不存在"); LoginUser userDetails = loadUser(user); if (!userDetails.isEnabled()) { throw new DisabledException("该账户已被禁用!"); } else if (!userDetails.isAccountNonLocked()) { throw new LockedException("该账号已被锁定!"); } else if (!userDetails.isAccountNonExpired()) { throw new AccountExpiredException("该账号已过期!"); } return userDetails; } private LoginUser loadUser(User user) { Collection<SimpleGrantedAuthority> authorities =new ArrayList<>(); user.getUserTags().stream().forEach(tag-> authorities.add(new SimpleGrantedAuthority(tag.equals("1")?"ROLE_ADMIN":"ROLE_USER")) ); LoginUser loginUser = new LoginUser(); loginUser.setAuthorities(authorities); return LoginUser.builder() .userId(1L) .username(user.getUserName()) .enabled(user.getEnable()) .authorities(authorities) // 这里的密码就是正确密码,要拿前端传来的和下面的比较 .password(new BCryptPasswordEncoder().encode(user.getPassWord())).build(); } }
不管要不要自己手动设计service,都要通过rpc调用,查询到username对应的那个用户,以及对应的权限。
参考以下代码
@Service @Slf4j public class SecurityUserDetailService implements UserDetailsService { @Autowired private UserService userService; @Autowired private PermissionService permissionService; @Override public UserDetails loadUserByUsername(String username) { UserEntity user = userService.getUserByUsername(username); if (user == null) { return null; } //获取权限 List<PermissionEntry> permissions = permissionService.getPermissionsByUserId(user.getId()); List<String> codes = permissions.stream().map(PermissionEntry::getCode).collect(Collectors.toList()); String[] authorities = null; if (CollectionUtils.isNotEmpty(codes)) { authorities = new String[codes.size()]; codes.toArray(authorities); } //身份令牌 String principal = JSON
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。