security_security3 - CSDN
security 订阅
网络安全技术及其协议,包括了网络通信安全、信息在网络传输中的保密性和完整性、控制访问受限网域与敏感信息以及在公共网络如因特网上使用隐秘通讯。为了解决这些问题,各大组织及技术供应商纷纷推出了各种网络和信息安全技术。 展开全文
网络安全技术及其协议,包括了网络通信安全、信息在网络传输中的保密性和完整性、控制访问受限网域与敏感信息以及在公共网络如因特网上使用隐秘通讯。为了解决这些问题,各大组织及技术供应商纷纷推出了各种网络和信息安全技术。
信息
外文名
Security
包括了
网络通信安全
中文名
网络安全技术及其协议
推出了
各种网络和信息安全技术
Security基本介绍
Security:网络安全技术及其协议(Network Security Technologies and Protocols:AAA,VPN and Firewall)
收起全文
  • dubbo,redis,solr,freemarker,activeMQ,springBoot框架,微信支付,nginx负载均衡,电商活动秒杀,springSecurity安全框架,FastDFS分布式文件服务器,还会涉及到代码生成器,   前台的技术有angularJS和...
  • 肖老师这套课程从普通项目的权限设计-->>百万级的中型项目权限设计--&...视频详细介绍了spring security权限框架的使用和优缺点; 在实际的项目开发中,本课程对于绝大多数的业务系统的权限设计都具有指导意义.
  • Spring Security 是 Spring 家族中的一个安全管理框架,实际上,在 Spring Boot 出现之前,Spring Security 就已经发展了多年了,但是使用的并不多,安全管理这个领域,一直是 Shiro 的天下。 相对于 Shiro,在 SSM...

    Spring Security 是 Spring 家族中的一个安全管理框架,实际上,在 Spring Boot 出现之前,Spring Security 就已经发展了多年了,但是使用的并不多,安全管理这个领域,一直是 Shiro 的天下。

    相对于 Shiro,在 SSM/SSH 中整合 Spring Security 都是比较麻烦的操作,所以,Spring Security 虽然功能比 Shiro 强大,但是使用反而没有 Shiro 多(Shiro 虽然功能没有 Spring Security 多,但是对于大部分项目而言,Shiro 也够用了)。

    自从有了 Spring Boot 之后,Spring Boot 对于 Spring Security 提供了 自动化配置方案,可以零配置使用 Spring Security。

    因此,一般来说,常见的安全管理技术栈的组合是这样的:

    • SSM + Shiro
    • Spring Boot/Spring Cloud + Spring Security

    注意,这只是一个推荐的组合而已,如果单纯从技术上来说,无论怎么组合,都是可以运行的。

    我们来看下具体使用。

    1.项目创建

    在 Spring Boot 中使用 Spring Security 非常容易,引入依赖即可:

    pom.xml 中的 Spring Security 依赖:

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

    只要加入依赖,项目的所有接口都会被自动保护起来。

    2.初次体验

    我们创建一个 HelloController:

    @RestController
    public class HelloController {
        @GetMapping("/hello")
        public String hello() {
            return "hello";
        }
    }
    

    访问 /hello ,需要登录之后才能访问。

    当用户从浏览器发送请求访问 /hello 接口时,服务端会返回 302 响应码,让客户端重定向到 /login 页面,用户在 /login 页面登录,登陆成功之后,就会自动跳转到 /hello 接口。

    另外,也可以使用 POSTMAN 来发送请求,使用 POSTMAN 发送请求时,可以将用户信息放在请求头中(这样可以避免重定向到登录页面):

    通过以上两种不同的登录方式,可以看出,Spring Security 支持两种不同的认证方式:

    • 可以通过 form 表单来认证
    • 可以通过 HttpBasic 来认证

    3.用户名配置

    默认情况下,登录的用户名是 user ,密码则是项目启动时随机生成的字符串,可以从启动的控制台日志中看到默认密码:

    这个随机生成的密码,每次启动时都会变。对登录的用户名/密码进行配置,有三种不同的方式:

    • 在 application.properties 中进行配置
    • 通过 Java 代码配置在内存中
    • 通过 Java 从数据库中加载

    前两种比较简单,第三种代码量略大,本文就先来看看前两种,第三种后面再单独写文章介绍,也可以参考我的微人事项目

    3.1 配置文件配置用户名/密码

    可以直接在 application.properties 文件中配置用户的基本信息:

    spring.security.user.name=javaboy
    spring.security.user.password=123
    

    配置完成后,重启项目,就可以使用这里配置的用户名/密码登录了。

    3.2 Java 配置用户名/密码

    也可以在 Java 代码中配置用户名密码,首先需要我们创建一个 Spring Security 的配置类,集成自 WebSecurityConfigurerAdapter 类,如下:

    @Configuration
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            //下面这两行配置表示在内存中配置了两个用户
            auth.inMemoryAuthentication()
                    .withUser("javaboy").roles("admin").password("$2a$10$OR3VSksVAmCzc.7WeaRPR.t0wyCsIj24k0Bne8iKWV1o.V9wsP8Xe")
                    .and()
                    .withUser("lisi").roles("user").password("$2a$10$p1H8iWa8I4.CA.7Z8bwLjes91ZpY.rYREGHQEInNtAp4NzL6PLKxi");
        }
        @Bean
        PasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }
    }
    

    这里我们在 configure 方法中配置了两个用户,用户的密码都是加密之后的字符串(明文是 123),从 Spring5 开始,强制要求密码要加密,如果非不想加密,可以使用一个过期的 PasswordEncoder 的实例 NoOpPasswordEncoder,但是不建议这么做,毕竟不安全。

    Spring Security 中提供了 BCryptPasswordEncoder 密码编码工具,可以非常方便的实现密码的加密加盐,相同明文加密出来的结果总是不同,这样就不需要用户去额外保存的字段了,这一点比 Shiro 要方便很多。

    4.登录配置

    对于登录接口,登录成功后的响应,登录失败后的响应,我们都可以在 WebSecurityConfigurerAdapter 的实现类中进行配置。例如下面这样:

    @Configuration
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        @Autowired
        VerifyCodeFilter verifyCodeFilter;
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.addFilterBefore(verifyCodeFilter, UsernamePasswordAuthenticationFilter.class);
            http
            .authorizeRequests()//开启登录配置
            .antMatchers("/hello").hasRole("admin")//表示访问 /hello 这个接口,需要具备 admin 这个角色
            .anyRequest().authenticated()//表示剩余的其他接口,登录之后就能访问
            .and()
            .formLogin()
            //定义登录页面,未登录时,访问一个需要登录之后才能访问的接口,会自动跳转到该页面
            .loginPage("/login_p")
            //登录处理接口
            .loginProcessingUrl("/doLogin")
            //定义登录时,用户名的 key,默认为 username
            .usernameParameter("uname")
            //定义登录时,用户密码的 key,默认为 password
            .passwordParameter("passwd")
            //登录成功的处理器
            .successHandler(new AuthenticationSuccessHandler() {
                @Override
                public void onAuthenticationSuccess(HttpServletRequest req, HttpServletResponse resp, Authentication authentication) throws IOException, ServletException {
                        resp.setContentType("application/json;charset=utf-8");
                        PrintWriter out = resp.getWriter();
                        out.write("success");
                        out.flush();
                    }
                })
                .failureHandler(new AuthenticationFailureHandler() {
                    @Override
                    public void onAuthenticationFailure(HttpServletRequest req, HttpServletResponse resp, AuthenticationException exception) throws IOException, ServletException {
                        resp.setContentType("application/json;charset=utf-8");
                        PrintWriter out = resp.getWriter();
                        out.write("fail");
                        out.flush();
                    }
                })
                .permitAll()//和表单登录相关的接口统统都直接通过
                .and()
                .logout()
                .logoutUrl("/logout")
                .logoutSuccessHandler(new LogoutSuccessHandler() {
                    @Override
                    public void onLogoutSuccess(HttpServletRequest req, HttpServletResponse resp, Authentication authentication) throws IOException, ServletException {
                        resp.setContentType("application/json;charset=utf-8");
                        PrintWriter out = resp.getWriter();
                        out.write("logout success");
                        out.flush();
                    }
                })
                .permitAll()
                .and()
                .httpBasic()
                .and()
                .csrf().disable();
        }
    }
    

    我们可以在 successHandler 方法中,配置登录成功的回调,如果是前后端分离开发的话,登录成功后返回 JSON 即可,同理,failureHandler 方法中配置登录失败的回调,logoutSuccessHandler 中则配置注销成功的回调。

    5.忽略拦截

    如果某一个请求地址不需要拦截的话,有两种方式实现:

    • 设置该地址匿名访问
    • 直接过滤掉该地址,即该地址不走 Spring Security 过滤器链

    推荐使用第二种方案,配置如下:

    @Configuration
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        @Override
        public void configure(WebSecurity web) throws Exception {
            web.ignoring().antMatchers("/vercode");
        }
    }
    

    Spring Security 另外一个强大之处就是它可以结合 OAuth2 ,玩出更多的花样出来,这些我们在后面的文章中再和大家细细介绍。

    本文就先说到这里,有问题欢迎留言讨论。

    关注公众号【江南一点雨】,专注于 Spring Boot+微服务以及前后端分离等全栈技术,定期视频教程分享,关注后回复 Java ,领取松哥为你精心准备的 Java 干货!

    展开全文
  • Spring Boot框架我们前面已经介绍了很多了,相信看了前面的博客的小伙伴对Spring Boot...OK,那我们今天要说的是Spring Boot中另外一个比较重要的东西,那就是Spring Security,这是一个专门针对基于Spring的项目的安全

    关注公众号【江南一点雨】,专注于 Spring Boot+微服务以及前后端分离等全栈技术,定期视频教程分享,关注后回复 Java ,领取松哥为你精心准备的 Java 干货!


    Spring Boot框架我们前面已经介绍了很多了,相信看了前面的博客的小伙伴对Spring Boot应该有一个大致的了解了吧,如果有小伙伴对Spring Boot尚不熟悉,可以先移步这里从SpringMVC到Spring Boot,老司机请略过。OK,那我们今天要说的是Spring Boot中另外一个比较重要的东西,那就是Spring Security,这是一个专门针对基于Spring的项目的安全框架,它主要是利用了我们前文介绍过的的AOP(Spring基础配置)来实现的。以前在Spring框架中使用Spring Security需要我们进行大量的XML配置,但是,Spring Boot在这里依然有惊喜带给我们,我们今天就一起来看看。
    毫无疑问,Spring Boot针对Spring Security也提供了自动配置的功能,这些默认的自动配置极大的简化了我们的开发工作,我们今天就来看看这个吧。
    #创建Project并添加相关依赖
    Project的创建和前文一样,唯一要注意的地方就是创建的时候添加的依赖不同,如下图:
    这里写图片描述
    OK,创建成功之后添加相关依赖,数据库我这里使用MySql,所以添加MySql驱动,然后要添加Spring Security的支持,所以还要添加Spring Security的依赖,如下:

    <dependency>
                <groupId>org.thymeleaf.extras</groupId>
                <artifactId>thymeleaf-extras-springsecurity4</artifactId>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.40</version>
            </dependency>
    

    #配置application.properties
    这个东东的配置还是和我们上文说到的是一样的,这里也没啥好说的,有问题的小伙伴翻看前文(初识在Spring Boot中使用JPA):

    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.url=jdbc:mysql://localhost:3306/sang?useUnicode=true&characterEncoding=utf-8
    spring.datasource.username=root
    spring.datasource.password=sang
    logging.level.org.springframework.security=info
    spring.thymeleaf.cache=false
    spring.jpa.hibernate.ddl-auto=update
    spring.jpa.show-sql=true
    

    #定义用户和角色
    我们这里使用JPA来定义用户和角色,用户和角色都存储在数据库中,我们直接通过在数据库中查询然后来使用。

    定义角色

    我们的角色实体类和表都很简单,就两个字段,一个id,一个name属性表示角色的名称,实体类如下;

    @Entity
    public class SysRole {
        @Id
        @GeneratedValue
        private Long id;
        private String name;
    
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    

    OK,简简单单就这两个属性。
    ##定义用户
    我们在定义用户的时候需要实现UserDetails接口,这样我们的用户实体即为Spring Security所使用的用户,定义好用户之后,我们还要配置用户和角色之间的多对多关系,正常情况下,角色和权限是两回事,所以我们还需要重写getAuthorities方法,将用户的角色和权限关联起来,代码如下:

    @Entity
    public class SysUser implements UserDetails {
        @Id
        @GeneratedValue
        private Long id;
        private String username;
        private String password;
    
        @ManyToMany(cascade = {CascadeType.REFRESH},fetch = FetchType.EAGER)
        private List<SysRole> roles;
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public void setPassword(String password) {
            this.password = password;
        }
    
        public List<SysRole> getRoles() {
            return roles;
        }
    
        public void setRoles(List<SysRole> roles) {
            this.roles = roles;
        }
    
        @Override
        public Collection<? extends GrantedAuthority> getAuthorities() {
            List<GrantedAuthority> auths = new ArrayList<>();
            List<SysRole> roles = this.getRoles();
            for (SysRole role : roles) {
                auths.add(new SimpleGrantedAuthority(role.getName()));
            }
            return auths;
        }
    
        @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 true;
        }
    }
    
    

    OK,经过上面两个步骤之后我们的用户就和角色关联起来了,这个时候运行Project就会在数据库中自动帮我们生成三张表,用户表、角色表和两者的关联表,如下:
    这里写图片描述
    ##预设数据
    我们先在表中定义好几个角色和用户,方便我们后边做测试用,OK,预设数据的话,那我们执行如下几行数据插入代码:

    insert  into `sys_role`(`id`,`name`) values (1,'ROLE_ADMIN'),(2,'ROLE_USER');
    
    insert  into `sys_user`(`id`,`password`,`username`) values (1,'root','root'),(2,'sang','sang');
    
    insert  into `sys_user_roles`(`sys_user_id`,`roles_id`) values (1,1),(2,2);
    
    

    我们向数据库中插入两个用户两个角色,再将这两个用户两个角色关联起来即可。
    #创建传值对象
    数据创建成功之后,在客户端请求网页的时候我们需要有一个实体类用来向客户端传递消息,OK,那我们创建一个MSG对象:

    public class Msg {
        private String title;
        private String content;
        private String extraInfo;
    
        public Msg() {
        }
    
        public String getTitle() {
            return title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public String getContent() {
            return content;
        }
    
        public void setContent(String content) {
            this.content = content;
        }
    
        public String getExtraInfo() {
            return extraInfo;
        }
    
        public void setExtraInfo(String extraInfo) {
            this.extraInfo = extraInfo;
        }
    
        public Msg(String title, String content, String extraInfo) {
            this.title = title;
            this.content = content;
            this.extraInfo = extraInfo;
        }
    }
    

    这就是一个普通的类,没什么好说的。
    #创建数据访问接口

    public interface SysUserRepository extends JpaRepository<SysUser, Long> {
        SysUser findByUsername(String username);
    }
    

    这个也是写了n多遍的东西了,不赘述,关于这里如果小伙伴有疑问可以参考这里(初识在Spring Boot中使用JPA)。需要注意的是这里只需要一个根据用户名查询出用户的方法即可,不需要通过用户名和密码去查询。
    #自定义UserDetailsService
    自定义UserDetailsService,实现相应的接口,如下:

    public class CustomUserService implements UserDetailsService {
        @Autowired
        SysUserRepository userRepository;
        @Override
        public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
            SysUser user = userRepository.findByUsername(s);
            if (user == null) {
                throw new UsernameNotFoundException("用户名不存在");
            }
            System.out.println("s:"+s);
            System.out.println("username:"+user.getUsername()+";password:"+user.getPassword());
            return user;
        }
    }
    

    首先这里我们需要重写UserDetailsService接口,然后实现该接口中的loadUserByUsername方法,通过该方法查询到对应的用户,这里之所以要实现UserDetailsService接口,是因为在Spring Security中我们配置相关参数需要UserDetailsService类型的数据。
    #SpringMVC配置

    @Configuration
    public class WebMvcConfig extends WebMvcConfigurerAdapter {
        @Override
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/login").setViewName("login");
        }
    }
    

    当用户访问login时跳转到login.html页面。
    #配置Spring Security

    @Configuration
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
        @Bean
        UserDetailsService customUserService() {
            return new CustomUserService();
        }
    
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(customUserService());
        }
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests()
                    .anyRequest().authenticated()
                    .and().formLogin().loginPage("/login").failureUrl("/login?error").permitAll().and()
                    .logout().permitAll();
        }
    }
    

    OK ,关于这个配置我要多说两句:

    1.首先当我们要自定义Spring Security的时候我们需要继承自WebSecurityConfigurerAdapter来完成,相关配置重写对应 方法即可。
    2.我们在这里注册CustomUserService的Bean,然后通过重写configure方法添加我们自定义的认证方式。
    3.在configure(HttpSecurity http)方法中,我们设置了登录页面,而且登录页面任何人都可以访问,然后设置了登录失败地址,也设置了注销请求,注销请求也是任何人都可以访问的。
    4.permitAll表示该请求任何人都可以访问,.anyRequest().authenticated(),表示其他的请求都必须要有权限认证。
    5.这里我们可以通过匹配器来匹配路径,比如antMatchers方法,假设我要管理员才可以访问admin文件夹下的内容,我可以这样来写:.antMatchers("/admin/**").hasRole("ROLE_ADMIN"),也可以设置admin文件夹下的文件可以有多个角色来访问,写法如下:.antMatchers("/admin/**").hasAnyRole("ROLE_ADMIN","ROLE_USER")
    6.可以通过hasIpAddress来指定某一个ip可以访问该资源,假设只允许访问ip为210.210.210.210的请求获取admin下的资源,写法如下.antMatchers("/admin/**").hasIpAddress("210.210.210.210")
    7.更多的权限控制方式参看下表:
    这里写图片描述
    8.这里我们还可以做更多的配置,参考如下代码:

    http.authorizeRequests()
                    .anyRequest().authenticated()
                    .and().formLogin().loginPage("/login")
                    //设置默认登录成功跳转页面
                    .defaultSuccessUrl("/index").failureUrl("/login?error").permitAll()
                    .and()
                    //开启cookie保存用户数据
                    .rememberMe()
                    //设置cookie有效期
                    .tokenValiditySeconds(60 * 60 * 24 * 7)
                    //设置cookie的私钥
                    .key("")
                    .and()
                    .logout()
                    //默认注销行为为logout,可以通过下面的方式来修改
                    .logoutUrl("/custom-logout")
                    //设置注销成功后跳转页面,默认是跳转到登录页面
                    .logoutSuccessUrl("")
                    .permitAll();
    

    OK,这里算是核心了,多说两句。

    #创建登录页面

    在template文件夹中创建login.html页面,内容如下:

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8"/>
        <title>登录</title>
        <link rel="stylesheet" th:href="@{css/bootstrap.min.css}"/>
        <link rel="stylesheet" th:href="@{css/signin.css}"/>
        <style type="text/css">
            body {
                padding-top: 50px;
            }
    
            .starter-template {
                padding: 40px 15px;
                text-align: center;
            }
        </style>
    </head>
    <body>
    <nav class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <a class="navbar-brand" href="#">Spring Security演示</a>
            </div>
            <div id="navbar" class="collapse navbar-collapse">
                <ul class="nav navbar-nav">
                    <li><a th:href="@{/}">首页</a></li>
                    <li><a th:href="@{http://www.baidu.com}">百度</a></li>
                </ul>
            </div>
        </div>
    </nav>
    <div class="container">
        <div class="starter-template">
            <p th:if="${param.logout}" class="bg-warning">已注销</p>
            <p th:if="${param.error}" class="bg-danger">有错误,请重试</p>
            <h2>使用账号密码登录</h2>
            <form class="form-signin" role="form" name="form" th:action="@{/login}" action="/login" method="post">
                <div class="form-group">
                    <label for="username">账号</label>
                    <input type="text" class="form-control" name="username" value="" placeholder="账号"/>
                </div>
                <div class="form-group">
                    <label for="password">密码</label>
                    <input type="password" class="form-control" name="password" placeholder="密码"/>
                </div>
                <input type="submit" id="login" value="Login" class="btn btn-primary"/>
            </form>
        </div>
    </div>
    </body>
    </html>
    

    这里就是一个普通的html页面,用到了thymeleaf模板引擎(thymeleaf可以参考这两篇文章使用Spring Boot开发Web项目/使用Spring Boot开发Web项目(二)之添加HTTPS支持),
    #创建登录成功后跳转页面

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org"
          xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
    <head>
        <meta charset="UTF-8"/>
        <title sec:authentication="name"></title>
        <link rel="stylesheet" th:href="@{css/bootstrap.min.css}"/>
        <style type="text/css">
            body {
                padding-top: 50px;
            }
    
            .starter-template {
                padding: 40px 15px;
                text-align: center;
            }
        </style>
    </head>
    <body>
    <nav class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <a class="navbar-brand" href="#">Spring Security演示</a>
            </div>
            <div id="navbar" class="collapse navbar-collapse">
                <ul class="nav navbar-nav">
                    <li><a th:href="@{/}">首页</a></li>
                    <li><a th:href="@{http://www.baidu.com}">百度</a></li>
                </ul>
            </div>
        </div>
    </nav>
    <div class="container">
        <div class="starter-template">
            <h1 th:text="${msg.title}"></h1>
            <p class="bg-primary" th:text="${msg.content}"></p>
            <div sec:authorize="hasRole('ROLE_ADMIN')">
                <p class="bg-info" th:text="${msg.extraInfo}"></p>
            </div>
            <div sec:authorize="hasRole('ROLE_USER')">
                <p class="bg-info">无更多显示信息</p>
            </div>
            <form th:action="@{/logout}" method="post">
                <input type="submit" class="btn btn-primary" value="注销"/>
            </form>
        </div>
    </div>
    </body>
    </html>
    

    这里有如下几个问题需要说明:

    1.在html标签中我们引入的Spring Security
    2.通过sec:authentication="name"我们可以获取当前用户名
    3.sec:authorize="hasRole('ROLE_ADMIN')表示当前用户角色为ROLE_ADMIN的话显示里边的内容
    4.sec:authorize="hasRole('ROLE_USER')表示当前用户角色为ROLE_USER的话显示该DIV里边的内容

    #添加控制器

    @Controller
    public class HomeController {
        @RequestMapping("/")
        public String index(Model model) {
            Msg msg = new Msg("测试标题", "测试内容", "额外信息,只对管理员显示");
            model.addAttribute("msg", msg);
            return "index";
        }
    }
    

    #测试

    首页如下:

    访问http://localhost:8080/自动跳转到http://localhost:8080/login
    这里写图片描述
    ##登录出错
    输入错误的账号密码进行登录,结果如下:
    这里写图片描述
    ##管理员登录
    使用管理员帐号密码登录,结果如下:
    这里写图片描述
    ##普通用户登录
    使用普通用户帐号密码登录,结果如下:
    这里写图片描述
    ##注销
    点击注销按钮,结果如下:
    这里写图片描述

    OK,以上就是对Spring Security的一个简单介绍,是不是比自己通过过滤器、拦截器神马的来弄简单多了。

    本文案例下载:
    本文案例GitHub地址https://github.com/lenve/JavaEETest/tree/master/Test26-Security.

    更多Spring Boot资料请移步这里从SpringMVC到Spring Boot

    以上。

    参考资料:
    《JavaEE开发的颠覆者 Spring Boot实战》第九章

    展开全文
  • 1,漏洞扫描:使用自动化工具如nessus、microsoft baseline security analuzer来查找已知的漏洞***测试:试图实际利用漏洞,并***系统 2,被动侦察:没有与目标实际连接的情况下进行的侦察,如从安全网站收集信息...

    1,
    漏洞扫描:使用自动化工具如nessus、microsoft baseline security analuzer来查找已知的漏洞
    ***测试:试图实际利用漏洞,并***系统

    2,
    被动侦察:没有与目标实际连接的情况下进行的侦察,如从安全网站收集信息
    主动侦察:设计与目标网络的通信,如漏洞扫描
    两者主要差别:被动没接网,主动接网

    3,
    pivot:跳板***,指***A,并把A作为***B的基础

    4,
    shimming:是指***者再应用程序和其他文件之间放置一些恶意软件,并拦截到该文件(通常是到库或系统API)的通信

    5,
    破解密码方式:
    raibow table彩虹表:是一个预先计算的散列表用于检索密码。
    dictionary attack字典***:利用常见或可能的密码列表。
    暴力破解:利用一切可以的密码。
    collision:碰撞,是两个不同的输入产生相同的哈希。
    6,
    bluejacking 蓝牙劫持:蓝牙设备处于一定距离时向他们发送未经请求的信息
    bluesnarfing:从蓝牙设备获取数据

    7,
    wifi protected setup 简称wps,使用一个pin连接到无限接入点(wap),wps试图拦截传输中的pin,连接到wap,然后窃取wpa2的密码。
    IV attack:初始向量***,是一种隐蔽的加密***,与流密码一起使用,IV***试图利用漏洞使用IV公开加密数据

    evil twin:虚假的接入点,传播和的ssid,和未经授权计入点一样

    jimmimg:wifi干扰,阻塞wifi信号的无线***,使用户无法连接到无线网络

    8,
    dns poison:dns中毒试图将假的的dns记录放入dns服务器。
    dns spoofing:dns欺骗,使用加的dns信息。
    amplification attack|:发送过大的假DNS请求,是一种高度专门化的拒绝服务类型***。

    9,
    多重感染:同时感染操作系统中的文件和引导扇区。

    10,

    转载于:https://blog.51cto.com/8525378/2369794

    展开全文
  • 说起考security+这个认证考试还是比较尴尬的,因为根本没想过要考这个认证,但是现在想混安全界必须有几本证在手,没有证书很难找到高薪资的工作。而且相比CISP、CISSP而言,Security+的性价比还是很高的。很值得...

    前言

    说起考security+这个认证考试还是比较尴尬的,因为根本没想过要考这个认证,但是现在想混安全界必须有几本证在手,没有证书很难找到高薪资的工作。而且相比CISP、CISSP而言,Security+的性价比还是很高的。很值得入门安全的小白去考这个认证。我从报名培训班到考出证书历时大约20天左右,其实难度不怎么高,毕竟还是偏理论的。只要你稳扎稳打,认真得学习了解每个知识概念,通过基本上没什么问题。

    入坑经历

    某天无意间加入了谷安一个security+认证的公开课微信群,听老师扯了一个小时的关于security+考试认证的事情,然后就有老师加了我,我就顺利入坑学习了。报了名之后就顺便上网百度或者google下security+的知识体系及考试中占的百分比。Security+知识体系分为网络安全(Network Security)、合规与操作安全(Compliance and Operational Security)、威胁与脆弱性(Threats and Vulnerabilities)、应用数据与主机安全(Application,data and Host Security)、访问控制与身份管理(Access Control and Identity Management)、密码学(Cryptography)。具体的分值分布大家可以看下图:

    这些知识就算大家是小白也不用担心,毕竟你是报了培训班的,定期都会安排讲课的,并且还有答疑的课,还有谷安再安全牛网校上开的往期的security+培训录播视频,你也会收到谷安发过来的三本书(一本讲义、一本sy401书、一本习题册),所以资源这么丰富,只要你认真去学习,你还过不了就太对不起自己了。

           备考经历

           我基本按时的去上直播课,每天花个一小时或者半小时的时间做点习题或者看书(sy-401),随便说一句我觉得看sy-401这本书还是很有必要的,对小白来说,可以帮你建立起整个security+知识体系架构,里面的知识点也很详细,只要你熟读牢记里面的每个知识点,题海战术这个完全没有必要了,还有就是要多google、百度,因为有些知识点搜索出来的会更详细。直播课结束后,我就立马去报名了,才知道这个考试是要预约的(所以大家要报名考试的时候记得要安排好时间),我大约是等了一周后,才去考试的,所以这一周比较关键,我需要时不时的温习下知识点,毕竟知识是很容易遗忘的。我就经常翻个墙去做security+的英文题,个人比较喜欢装逼。(提醒一下其实考试的题目是英文翻译成中文的,所以不懂英文没关系,翻译得还蛮准确的)。这就是碎片记忆的魔力。当然你也可以做谷安网校发得习题集及每节直播课后发得电子习题(都有中文翻译哦),这些题目跟我去翻个墙做的题目都是一样的。

           考试经历

           考试的时候需要带上身份证、信用卡、驾驶证(其中两个),主要是为了做身份确认。这个概念就是访问控制与身份管理其中的单因素认证(what you have)。一定要提前一点到达考场,熟悉一下考场周围的环境。这样才不会慌慌张张的进考场考试,还有考试的时候一定要把握好心态,心态很关键,我就比较衰,一进考场。手握鼠标,看着显示屏,一脸闷逼,都不知道怎么操作,摸索了半天才顺利进入考试,考试的时候一定要遵循一个原则(就是尽量以第一印象为主,这是谷安老师的建议),没有特大把握不要去改做过的题目,我就是这样改了好几道,拿到成绩单,才发现都改错了。考试设计的还是蛮人性化,有标记可以设置,就是你做的时候,做不到不确定的题目时可以标记下,等都做完之后就可以回来检查了。考试时间其实有120分钟,其中90分钟是真正的考试时间,还有30分钟是在看考试守则之类的东西,当然你也可以跳过直接考试,做完题目提交之后,还会有一个问卷调查,做完调查之后你就可以知道成绩了,然后就出来高高兴兴领成绩单吧。我现在就在默默等待着证书的到来。

    附:我经常去的国外题库:

    https://www.exam-labs.com/

    还有一个是同期的微信群里小伙伴发的

    http://comptiaexamtest.com/Security+SY0-401/

    大家对security+认证感兴趣可以一起交流沟通,WX:HFQ300

    展开全文
  • 我在结合自己的做题库时发现有些题目并没有在讲义中提到但在官方指导手册中都有明确说明。在观看官方手册时一定要仔细,任何一个描述都可能成为考点。如果这本书能记下百分之九十,那800分我觉得不在话下。...
  • 6月16日通过考试,5月6日开始参加安全牛课堂的13期Security+的远程直播培训,算起来前前后后有一个多月的学习,把自己的经历简单分享下。 接触Security+也是偶然的机会,网上查了查信息安全的证书,有一篇《你值得...
  • Security考试复习资料

    2020-07-30 23:30:03
    Security+认证考试复习资料,考点讲解详细,已通过考试。
  • 我于11月11日参加并通过了Security+考试,下面我从两个方面跟大家讲述下我的备考和考试经过。 一、备考经历 Security+官方教材怎么用? Security+官方教材我个人觉得就两个作用: 第一通读了解有哪些知识点,...
  • security+学习资料.zip

    2020-07-30 23:31:30
    Security+认证考试复习资料,主要内容包括:安全基础概念知识,网络安全知识,密码学知识,访问控制欲身份管理知识,安全威胁与漏洞介绍等等。
  • 可以前往第一篇博客查看目录结构 --&gt; 这里一、在core模块下properties包中创建SmsCodePropertiespublic class SmsCodeProperties { //短信验证码长度 private int length = 6; //验证码过期时间 ...
  • 概述:Spring Security就是引入了一系列的SecurityFilter,将其添加到Spring中去了;在有请求时,根据URL是否符合每个Filter的规则来判断是否需要该Filter来进行处理。
  • Spring Security 简介

    2018-04-21 09:53:02
    xl_echo编辑整理,欢迎转载,转载请声明文章来源。更多IT、编程案例、资料请联系QQ:1280023003 百战不败,依不自称常胜,百败不颓,依能奋力前行。——这才是真正的堪称强大!! ... 在 Web 应用开发中,安全一直...
  • spring security CSRF防护

    2019-07-31 19:14:30
    从Spring Security 4.0开始,默认情况下会启用CSRF保护,以防止CSRF攻击应用程序,Spring Security CSRF会针对PATCH,POST,PUT和DELETE方法进行防护。 我这边是spring boot项目,在启用了@EnableWebSecurity...
  • 1. spring-security-oauth2的demo 不容易让开发者理解, 配置的内容很多, 没有分解的步骤; 我曾经试着按照文档(https://github.com/spring-projects/spring-security-oauth/blob/master/docs/oauth2.md) 配置了几次, ...
  • 因为项目需要,第一次接触Spring Security,早就听闻Spring Security强大但上手困难,今天学习了一天,翻遍了全网资料,才仅仅出入门道,特整理这篇文章来让后来者少踩一点坑(本文附带实例程序,请放心食用) ...
  • 基于Spring Security实现权限管理系统 稍微复杂一点的后台系统都会涉及到用户权限管理。何谓用户权限?我的理解就是,权限就是对数据(系统的实体类)和数据可进行的操作(增删查改)的集中管理。要构建一个可用的...
  • Spring Security 基本介绍 这里就不对Spring Security进行过多的介绍了,具体的可以参考官方文档 我就只说下SpringSecurity核心功能: 认证(你是谁) 授权(你能干什么) 攻击防护(防止伪造身份) 基本...
1 2 3 4 5 ... 20
收藏数 681,468
精华内容 272,587
关键字:

security