springboot集成spring-security

一、添加依赖:

<dependency>
    <groupId>org.springframework.boot
    <artifactId>spring-boot-starter-security
</dependency>

二、定义三个实体:用户类、角色类、权限类

@Data
public class User implements UserDetails {

	private Integer id;
	
    private String username;

    private String realName;

    private String password;

    private List roles;
	
	@Override
	public Collection getAuthorities() {
		return null;
	}
	
	@Override
	
	public String getPassword() {
		return password;
	}
	
	@Override
	public String getUsername() {
		return username;
	}
	
	@Override
	public boolean isAccountNonExpired() {
		return true;
	}
	
	@Override
	public boolean isAccountNonLocked() {
		return true;
	}
	
	@Override
	public boolean isCredentialsNonExpired() {
		return true;
	}
	
	@Override
	public boolean isEnabled() {
		return true;
	}

}



@Data
public class Role {
	private String roleName;
    private List permissions;
}

@Data
public class Permission {
	private String permissionName;
}

三、配置类

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

	@Autowired
	private MyUserDetailsServiceImpl myUserDetailsService;

    @Bean
	public BCryptPasswordEncoder passwordEncoder() {
		return new BCryptPasswordEncoder();
    }

	/***
	    * 权限过滤
	    * @date 2020/1/22
	    * @param http
	**/
    @Override
	protected void configure(HttpSecurity http) throws 	Exception {
		http
		.authorizeRequests()
		.anyRequest().authenticated()
		.and()
		.formLogin().loginPage("/login")
		.failureForwardUrl("/fail")
		.successHandler(new AuthenticationSuccessHandler() {
			@Override
			public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, 			    		  Authentication authentication)throws IOException, ServletException {
								httpServletResponse.setContentType("application/json;charset=utf-8");
		                        RequestCache cache =new HttpSessionRequestCache();
		                        SavedRequest savedRequest = cache.getRequest(httpServletRequest, httpServletResponse);
		                        String url = savedRequest.getRedirectUrl();
		                        httpServletResponse.sendRedirect(url);
                    }
	})

		.permitAll()
		.and()
		.logout().logoutUrl("/logout").logoutSuccessUrl("/logout.html").permitAll()
		//禁用跨域请求
         .and().csrf().disable();

    }

@Override
protected void configure(AuthenticationManagerBuilder auth)throws Exception {
//下面这两行配置表示在内存中配置了两个用户,进行认证
//        auth.inMemoryAuthentication()
//                .passwordEncoder(passwordEncoder())
//                .withUser("lisi").roles("USER").password(passwordEncoder().encode("123"))
//                .and()
//                .withUser("admin").roles("USER","ADMIN").password(passwordEncoder().encode("123"));
        //调用数据库中的用户进行认证
        auth.userDetailsService(myUserDetailsService);
    }
}

四、权限验证配置类

@Configuration
public class MyPermissionEvaluator implements PermissionEvaluator {

	@Override
	public boolean hasPermission(Authentication authentication, Object permission, Object operation) {
			boolean accessable =false;
	        User user = (User) authentication.getPrincipal();
	        
	        if (user !=null) {
				for (GrantedAuthority authorities : authentication.getAuthorities()) {
					String authorities1 = String.format("%s-%s", permission, operation);
				    if (authorities1.equals(authorities.getAuthority())) {
						return accessable =true;
		             }
				}
			}
			return accessable;
	 }
	
	@Override
	public boolean hasPermission(Authentication authentication, Serializable serializable, String s, Object o) {
		return false;
	}
}

五、通过数据库查询

@Component
public class MyUserDetailsServiceImpl implements UserDetailsService {

	@Autowired
	private UserService userService;

    @Override
	public UserDetails loadUserByUsername(String username)throws UsernameNotFoundException {
	
		User user = userService.findUserByUserName(username);
		
		if (user ==null) {
			throw new UsernameNotFoundException(String.format("No user found with username: %s", username));
		 }
		
		List authorities =new ArrayList<>();
		for (Role role : user.getRoles()) {
			for (Permission permission : role.getPermissions()) {
				authorities.add(new SimpleGrantedAuthority(String.format("%s-%s", role.getRoleName(), 	permission.getPermissionName())));
		
		     }
		}
		
		return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), user.isEnabled(),
		
		                user.isAccountNonExpired(), user.isCredentialsNonExpired(), user.isAccountNonLocked(), authorities);
		    }
}





@Service
public class UserService {

	//密码加密
	@Autowired
	private BCryptPasswordEncoder passwordEncoder;
	
	public User findUserByUserName(String userName) {
	
		List userList = create();
	    List users = userList.parallelStream().filter(user -> user.getUsername().equals(userName)).collect(Collectors.toList());
	        return users !=null ? users.get(0) :null;
	    }
	
	private List create() {
		Permission permission =new Permission();
        permission.setPermissionName("select");
        List permissions =new ArrayList<>();
        permissions.add(permission);
        Role role =new Role();
        role.setRoleName("admin");
        role.setPermissions(permissions);
        List roles =new ArrayList<>();
        roles.add(role);
        User user =new User();
        user.setId(1);
        user.setRealName("张三");
        user.setUsername("zhangsan");
        user.setPassword(passwordEncoder.encode("123456"));
        user.setRoles(roles);

        /**********************************************************/
        Permission permission1 =new Permission();
        permission1.setPermissionName("update");
        List permissions1 =new ArrayList<>();
        permissions1.add(permission1);
        Role role1 =new Role();
        role1.setRoleName("user");
        role1.setPermissions(permissions1);
        List roles1 =new ArrayList<>();
        roles1.add(role1);
        User user1 =new User();
        user1.setId(2);
        user1.setRealName("李四");
        user1.setUsername("lisi");
        user1.setPassword(passwordEncoder.encode("123456"));
        user1.setRoles(roles1);
        List users =new ArrayList<>();
        users.add(user);
        users.add(user1);
        return users;
	  }

}



@Controller
public class TestController {

	@RequestMapping("/hello")
	@PreAuthorize("hasPermission('admin','select')")
	public String hello() {
		return "hello.html";
	}
	
	@GetMapping("/login")
	public String loginIndex() {
		return "login.html";
	}
	
	@GetMapping("/test")
	@ResponseBody
	public String test() {
		return "hello world";
	}
	
	//    @RequestMapping("/myLogin")
	//    public String myLogin() {
	//        System.out.println("lllsldfds");
	//        return "hello";
	
	//    }
	
    @RequestMapping("/logout")
	public String logout() {
		return "logout.html";
	}
	
	@RequestMapping("/fail")
	@ResponseBody
	public String loginFail() {
		return "登录失败";
	}
}


//启动类
@SpringBootApplication
@EnableGlobalMethodSecurity(prePostEnabled =true)
public class SecurityApplication {
	public static void main(String[] args) {
		SpringApplication.run(SecurityApplication.class, args);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Security OAuth2 Authorization Server 是一个基于 Spring Security 的 OAuth2 认证服务器,用于管理 OAuth2 模式下的授权和令牌。 要将 Spring BootSpring Security OAuth2 Authorization Server 集成,可以遵循以下步骤: 1. 添加依赖 在 pom.xml 文件添加以下依赖: ```xml <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-oauth2-authorization-server</artifactId> <version>0.2.1</version> </dependency> ``` 2. 配置认证服务器 创建一个配置类,用于配置 OAuth2 认证服务器。这个类需要继承 AuthorizationServerConfigurerAdapter 类,并且实现 configure 方法。 ```java @Configuration public class OAuth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { // 配置客户端信息 clients.inMemory() .withClient("client") .secret("{noop}secret") .authorizedGrantTypes("authorization_code", "refresh_token") .redirectUris("http://localhost:8080/client") .scopes("read", "write"); } @Override public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { // 配置安全性 security.checkTokenAccess("isAuthenticated()"); } @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { // 配置端点 endpoints.authenticationManager(authenticationManager); } } ``` 上面的代码,我们配置了一个名为 "client" 的客户端,使用了授权码模式和刷新令牌模式。授权成功后,将重定向到 "http://localhost:8080/client" 页面。 3. 配置 Spring Security 为了使 OAuth2 认证服务器正常工作,需要配置 Spring Security。可以创建一个配置类,用于配置 Spring Security。 ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { // 配置 HTTP 安全性 http.authorizeRequests() .antMatchers("/oauth2/authorize").authenticated() .and().formLogin().and().csrf().disable(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { // 配置身份认证管理器 auth.inMemoryAuthentication() .withUser("user").password("{noop}password").roles("USER"); } } ``` 在上面的代码,我们配置了 HTTP 安全性和身份认证管理器。只有经过身份认证的用户才能访问 "/oauth2/authorize" 端点。 4. 启动应用程序 现在可以启动应用程序,并访问 "http://localhost:8080/oauth2/authorize?response_type=code&client_id=client&redirect_uri=http://localhost:8080/client" 来进行授权。授权成功后,将重定向到 "http://localhost:8080/client" 页面。 以上就是整合 Spring BootSpring Security OAuth2 Authorization Server 的基本步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值