زمانیکه یک یوزر و یا نقش داشته باشیم و بخواهیم در متدهای مختلف و به دفعات از آن استفاده کنیم می توانیم یک Meta Annotation تعریف کنیم و یوزر و نقش آن را در آن تعریف کنیم.
@Retention(RetentionPolicy.RUNTIME)
@WithMockUser(value = "john", roles = "VIEWER")
public @interface WithMockJohnViewer { }
سپس در تست های خود از WithMockJohnViewer استفاده می کنیم.
@Test
@WithMockJohnViewer
public void givenMockedJohnViewer_whenCallGetUsername_thenReturnUsername() {
String userName = userRoleService.getUsername();
assertEquals("john", userName);
}
- فرشته حقیقی 5 سال قبل پاسخ داد
برای تست امنیت در سطح متد در Sppring از انوتیشن WithMockUser@ استفاده می کنیم.با استفاده از این انوتیشن می توانیم متد خود را با یک یوزر تست کنیم بدون آنکه آن یوزر واقعا وجود داشته باشد.
@Test
@WithMockUser
public void login() {
...
}
در این انوتیشن یوزر برابر User
و پسورد برابر password و نقش آن ROLE_USER می باشد.
درصورتیکه بخواهیم می توانیم یوزر و نقش آن را مشخص کنیم.
@Test
@WithMockUser(username="admin",roles={"USER","ADMIN"})
public void login() {
...
}
- فرشته حقیقی 5 سال قبل پاسخ داد
امنیت در spring به ما این امکان را می دهد که در یک متد چندین انوتیشن امنیت قرار دهیم.مثلا می توانیم یک امنیت برای قبل از اجرای متد و یک امنیت برای بعد از اجرای متد قرار دهیم.
@PreAuthorize("#username == authentication.principal.username")
@PostAuthorize("returnObject.username == authentication.principal.nickName")
public CustomUser securedLoadUserDetail(String username) {
//...
}
- فرشته حقیقی 5 سال قبل پاسخ داد
useEffect
یک hook در ریکت می باشد و جایگزین component lifecycle های ریکت می باشد.این hook برای مواقعی است که تغییری در یک ویژگی یا هر چیز دیگر در برنامه رخ دهد. useEffect
ترکیب دو کامپوننت componentDidMount
و componentDidUpdate می باشد.
در مثال زیر هر زمانیکه متغیر user تغییر کند متد fetchUsers
اجرا می شود
useEffect( () => { fetchUsers(users) }, [ users ] );
درصورتیکه آرگومان دوم را پاس ندهیم useEffect
همیشه اجرا می شود.
useEffect( () => { fetchUsers(users) } );
- فرشته حقیقی 5 سال قبل پاسخ داد
- آخرین فعالیت در 5 سال قبل
Hooks یک قابلیت جدید در ریکت 16.8 می باشد. با استفاده از Hooks می توانیم از state و سایر ویژگی های ریکت بدون نوشتن کلاس استفاده کنیم.در واقع به جای نوشتن کلاس از متد (function) استفاده می کنیم و کدنویسی کمتری نیاز هست .در زیر یک مثال با استفاده از کلاس نشان داده شده است
class Appp extends React.Component {
constructor(props) {
super(props);
this.state = {count: 0};
}
render() {
return (
<div>
<button onClick={()=>this.setState({count : this.state.count+1})}>
click me
</button>
</div>
);
}
}
در مثال زیر از یک Hooks به نام useState استفاده شده است.
import React , {useState} from 'react';
function App(){
const[ count , setCount]=useState((0);
return (
<div>
<buttoon onclick={()=> setCount(count +1)}>
</buttonn>
</div>
);
}
useState فقط یک آرگومان دارد که در آن مقدار اولیه state را به آن می دهیم.
همانطور که می بینیم در مثال بالا از کلاس استفاده نشده و از function استفاده شده است.با استفاده از setCount میتوانیم count را مقداردهی کنیم.
- فرشته حقیقی 5 سال قبل پاسخ داد
- آخرین فعالیت در 5 سال قبل
درصورتیکه یک انوتیشن امنیت داشته باشیم که بخواهیم برای همه متدهای کلاس اعمال شود می توانیم آن را در سطح کلاس قرار دهیم.در این صورت آن امنیت برای همه متدهای آن کلاس اعمال می شود.
@Service
@PreAuthorize("hasRole('ROLE_ADMIN')")
public class SystemService {
public String getSystemYear(){
//...
}
public String getSystemDate(){
//...
}
}
در مثال بالا برای اجرای همه متدها باید کاربر نقش ROLE_ADMIN را داشته باشد.
- فرشته حقیقی 5 سال قبل پاسخ داد
درصورتیکه یک انوتیشن امنیت داشته باشیم که بخواهیم برای همه متدهای کلاس اعمال شود می توانیم آن را در سطح کلاس قرار دهیم.در این صورت آن امنیت برای همه متدهای آن کلاس اعمال می شود.
@Service
@PreAuthorize("hasRole('ROLE_ADMIN')")
public class SystemService {
public String getSystemYear(){
//...
}
public String getSystemDate(){
//...
}
}
در مثال بالا برای اجرای همه متدها باید کاربر نقش ROLE_ADMIN را داشته باشد.
- فرشته حقیقی 5 سال قبل پاسخ داد
انوتیشن PostFilter@ یکی از کنترل های در سطح متد در Spring Security می باشد.این انوتیشن لیست یا آرایه خروجی یک متد را فیلتر می کند.در مثال زیر لیست برگردانده شده توسط متد بررسی می شود و در صورتیکه username ای در لیست با یوزر جاری برابر باشد از لیست حذف می شود.
@PostFilter("filterObject != authentication.principal.username")
public List<String> getAllUsernamesExceptCurrent() {
//...
}
عناصر لیست خروجی متد توسط filterObject قابل دسترسی می باشند.
- فرشته حقیقی 5 سال قبل پاسخ داد
انوتیشن PreFilter@ یکی از انوتیشن های Spring Security در سطح متد می باشد.ابن انوتیشن لیست یا آرایه ورودی یک متد را قبل از اجرای متد فیلتر می کند.در مثال زیر قبل از اجرای متد یوزر چک می شود و در صورتیکه عنصر فعلی لیست برابر با کاربر جاری باشد متد اجرا نمی شود.
@PreFilter("filterObject != authentication.principal.username")
public String joinUsernames(List<String> usernames) {
//...
}
عناصر لیست با استفاده از filterObject قابل دستیابی می باشند.
در صورتیکه متد چند ورودی داشته باشد با استفاده از filterTarget آرگومان ورودی مورد نظر خود که می خواهیم فیلتر روی آن انجام شود را مشخص می کنیم.
@PreFilter
(value = "filterObject != authentication.principal.username",
filterTarget = "usernames")
public String joinUsernamesAndRoles(
List<String> usernames, List<String> roles) {
//...
}
- فرشته حقیقی 5 سال قبل پاسخ داد
انوتیشن PostAuthorize@ در Spring برای قرار کنترل ها در سطح متد می باشد.این انوتیشن کنترل تعریف شده را بعد از اجرای متد بررسی می کند و در صورتیکه نیاز باشد از برگرداندن خروجی متد جلوگیری می کند.در مثال زیر getUser در صورتی آبجکت user را برمی گرداند که userId در آبجکت user متد با userId کاربر جاری برابر باشد.
@PostAuthorize("returnObject.userId == principal.userId")
public User getUser(@PathVariable String id) {
//...
}
در این انوتیشن آبجکتی که توسط متد برگردانده می شود از طریق returnObject قابل دستیابی می باشد و principal.user یوزرآدی مربوط به کاربر جاری می باشد.
- فرشته حقیقی 5 سال قبل پاسخ داد
- آخرین فعالیت در 5 سال قبل
انوتیشن PreAuthorize@ در Spring کنترل دسترسی expression-based می باشد.این انوتیشن قبل از اجرای متد عبارت داده شده را بررسی می کند و سپس در صورت برقرار بودن عبارت متد را اجرا می کند.مثلا در مثال زیر قبل از اجرای متد بررسی می کند که در صورتیکه کاربر نقش ROLE_ADMIN
را دارد متد getUsername
اجرا شود
@PreAuthorize("hasRole("ROLE_ADMIN")(
public String getUsername() {
//...
}
می توانیم چند نقش معرفی کنیم
@PreAuthorize("hasRole('ROLE_VIEWER') or hasRole('ROLE_EDITOR')")
public boolean isValidUsername(String username) {
//....
}
- فرشته حقیقی 5 سال قبل پاسخ داد
برای redirect کردن به صفحات دیگر در جاوا اسکریپت از دستورات زیر استفاده می کنیم.
window.location.href = "https://mustang.ir/questions";
و یا
window.location.replace("https://mustang.ir/questions");
- فرشته حقیقی 5 سال قبل پاسخ داد
انوتیشن RoleAllowed@ در spring مشابه Secured@ برای تعیین سطح دسترسی اجرای متدها می باشد.مثلا در مثال زیر کاربرانی که نقش ROLE_ADMIN دارند می تواند متد getUsername را فراخوانی کنند.
@Secured("ROLE_ADMIN")
public String getUsername() {
//...
}
همچنین می توانیم مجموعه ای از نقش ها را به صورت زیر تعریف کنیم.
@Secured({ "ROLE_ADMIN", "ROLE_CUSTOMER" })
public boolean isValidUsername(String username) {
//....
}
- فرشته حقیقی 5 سال قبل پاسخ داد
- آخرین فعالیت در 5 سال قبل
انوتیشن Secured@ یکی از انوتیشن های مربوط به امنیت در اسپرینگ می باشد.این انتوتیشن سطح دسترسی کاربران به یک متد را مشخص می کند.مثلا در مثال زیر کاربرانی که نقش ROLE_ADMIN دارند می تواند متد getUsername را فراخوانی کنند.
@Secured("ROLE_ADMIN")
public String getUsername() {
//...
}
همچنین می توانیم مجموعه ای از نقش ها را به صورت زیر تعریف کنیم.
@Secured({ "ROLE_ADMIN", "ROLE_CUSTOMER" })
public boolean isValidUsername(String username) {
//....
}
در مثال بالا کاربرانی که یکی از نقش های ROLE_ADMIN و یا ROLE_CUSTOMER را داشته باشند می توانند به متد isValidUsername دسترسی داشته باشند.
- فرشته حقیقی 5 سال قبل پاسخ داد
برای استفاده از Spring Security در برنامه خود باید تگ زیر را در فایل maven خود تعریف کنیم.
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
</dependency>
- فرشته حقیقی 5 سال قبل پاسخ داد
فایل struts-config.xml در struts را در فایل web.xml در تگ servlet تعریف می کنیم.
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>
org.apache.struts.action.ActionServlet
</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts/struts-config.xml</param-value>
</init-param>
</servlet>
- فرشته حقیقی 5 سال قبل پاسخ داد
داده های بزرگ معمولا در فایل JSON ذخیره می شوند. برای خواندن فایل JSON در پایتون از متد read_json استفاده می کنیم.
import pandas as pd
df = pd.read_json('data.json')
- فرشته حقیقی 5 سال قبل پاسخ داد
الگوی طراحی Decorator برای اضافه کردن ویژگی ها و قابلیت های جدید به یک آبجکت در زمان اجرا می باشد.این الگو با استفاده از اینترفیس و پیاده سازی آن انجام می شود. در مثال زیر یک نمونه از این الگو را پیاده سازی می کنیم
ابتدا یک اینترفیس تعریف می کنیم.
public interface Shape {
void draw();
}
سپس دو پیاده سازی برای آن تعریف می کنیم.
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Rectangle");
}
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Shape: Circle");
}
}
سپس یک اینترفیس decorator تعریف می کنیم
public abstract class ShapeDecorator implements Shape {
protected Shape decoratedShape;
public ShapeDecorator(Shape decoratedShape){
this.decoratedShape = decoratedShape;
}
public void draw(){
decoratedShape.draw();
}
}
یک پیاده سازی برای این decorator تعریف می کنیم.
public class RedShapeDecorator extends ShapeDecorator {
public RedShapeDecorator(Shape decoratedShape) {
super(decoratedShape);
}
@Override
public void draw() {
decoratedShape.draw();
setRedBorder(decoratedShape);
}
private void setRedBorder(Shape decoratedShape){
System.out.println("Border Color: Red");
}
}
از آنجایی که در کلاس ShapeDecorator یک آبجکت از کلاس Shape می گیرد می توانیم هر نوع کلاس زیرمجموعه ای از کلاس Shape را به آن بدهیم و بنابراین هر آبجکت از کلاس RedShapeDecorator می تواند ویژگی های متفاوتی داشته باشد.
در مثال زیر دو آبجکت از کلاس RedShapeDecorator ایجاد کردیم که هر کدام قابلیتهای متفاوتی دارند.
public class DecoratorPatternDemo {
public static void main(String[] args) {
Shape circle = new Circle();
Shape redCircle = new RedShapeDecorator(new Circle());
Shape redRectangle = new RedShapeDecorator(new Rectangle());
System.out.println("Circle with normal border");
circle.draw();
System.out.println("\nCircle of red border");
redCircle.draw();
System.out.println("\nRectangle of red border");
redRectangle.draw();
}
}
- فرشته حقیقی 5 سال قبل پاسخ داد
Pandas یک کتابخانه در پایتون برای کار با مجموعه داده ها می باشد.با استفاده از این کتابخانه می توانیم داده های کلان(big data) را آنالیز کنیم.همچنین این کتابخانه می تواند مجموعه داده های آشفته را مرتب و خوانا کند که در داده کاوی بسیار مهم می باشد.و همچنین مقادیر مینیمم و ماکسیمم و یا میانیگین را در یک مجموعه پیدا کند. برای نصب این کتابخانه باید دستور زیر را اجرا کنیم
C:\Users\username>pip install pandas
سپس آن را در برنامه تعریف می کنیم.
import pandas
- فرشته حقیقی 5 سال قبل پاسخ داد
الحاق دو لیست در پایتون به سادگی با عملگر + انجام می شود.
list1 = ["a", "b", "c"]
list2 = [1, 2, 3]
list3 = list1 + list2
یک روش دیگر استفاده از متد append می باشد.به این صورت که اعضای یکی از لیستها را به لیست دیگر الحاق کنیم.
list1 = ["a", "b" , "c"]
list2 = [1, 2, 3]
for x in list2:
list1.append(x)
- فرشته حقیقی 5 سال قبل پاسخ داد